python - 在 Python 中使用 Matplotlib 制作 4 维散点图

标签 python matplotlib

本质上,我正在尝试制作一个包含 4 列数据的 4 维散点图(请参阅下面的示例)。

X (mm)  Y (mm)  Z (mm)  Diameter (mm)
11.096  11.0972 13.2401 124.279
14.6836 11.0389 8.37134 138.949
19.9543 11.1025 31.1912 138.949
15.4079 10.9505 31.1639 152.21
20.6372 14.5175 6.94501 152.211
20.47   11.225  31.3612 152.211
19.0432 11.3234 8.93819 152.213
29.4091 10.1331 26.6354 186.417
12.9391 10.6616 28.9523 186.418
29.9102 10.4828 25.1129 186.418
30.5483 12.163  15.9116 186.418
19.0631 10.5784 30.9791 186.418
9.65332 10.8563 12.975  186.419
8.4003  11.0417 17.0181 186.419
26.0134 10.6857 9.41572 186.419
13.7451 11.1495 28.7108 186.419

前三列数据(X、Y、Z)是第四列数据(直径)的坐标位置,因此我能够生成这些位置的 3-D 散点图。但是,我尝试根据某些阈值(即小于 100 毫米的直径为红色,101-200 毫米为蓝色,201-300 毫米为绿色等)用不同颜色标记绘制这些直径。标记的颜色确定后,它将根据其 X、Y、Z 坐标绘制这些标记。我尝试编写一个简单的 for 循环来执行此操作,但由于某种原因,它变得非常慢/滞后,并且也只会绘制一种颜色。谁能看看我的方法是否有问题?谢谢!

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas
import os

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

os.chdir(r'C:\Users\Me\Documents')
data = pandas.read_excel("Diameter Report", "Data")

X = data['X (mm)'].values.tolist()
Y = data['Y (mm)'].values.tolist()
Z = data['Z (mm)'].values.tolist()
dims = data['Diameter (mm)'].values.tolist()

for i in dims:
    if i < int(100):
        ax.plot(X, Y, Z, c='r', marker='o')
    elif i >= int(101) and i <200:
        ax.plot(X, Y, Z, c='b', marker='o')
    elif i >= int(201) and i <300:
        ax.plot(X, Y, Z, c='g', marker='o')

ax.set_xlabel('Center X (mm)')
ax.set_ylabel('Center Y (mm)')
ax.set_zlabel('Center Z (mm)')

plt.show()

Resulting plot

最佳答案

这些值的阈值似乎是等距的,因此您只需除以 100 并截断更多小数位即可。这允许绘制单个散点图而不是数百个图。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import pandas

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

data = pandas.read_excel("Diameter Report", "Data")

X = data['X (mm)'].values
Y = data['Y (mm)'].values
Z = data['Z (mm)'].values
dims = data['Diameter (mm)'].values

ax.scatter(X,Y,Z, c=(dims/100).astype(int), marker="o", cmap="brg")

ax.set_xlabel('Center X (mm)')
ax.set_ylabel('Center Y (mm)')
ax.set_zlabel('Center Z (mm)')

plt.show()

更一般的任意边界情况可能最好使用 BoundaryNorm 和具有与分类一样多的不同颜色的颜色图来解决。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import pandas as pd

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

d = np.random.rand(10,4)
d[:,3] = np.random.randint(1,300, 10)
data = pd.DataFrame(d, columns=["X (mm)","Y (mm)","Z (mm)","Diameter (mm)"])

X = data['X (mm)'].values
Y = data['Y (mm)'].values
Z = data['Z (mm)'].values
dims = data['Diameter (mm)'].values

bounds = [0,100,200,300]
colors = ["b", "r", "g"]
cmap = mcolors.ListedColormap(colors)
norm = mcolors.BoundaryNorm(bounds, len(colors))

sc = ax.scatter(X,Y,Z, c=dims, marker="o", cmap=cmap, norm=norm)

ax.set_xlabel('Center X (mm)')
ax.set_ylabel('Center Y (mm)')
ax.set_zlabel('Center Z (mm)')
fig.colorbar(sc)
plt.show()

enter image description here

关于python - 在 Python 中使用 Matplotlib 制作 4 维散点图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54425843/

相关文章:

python - 树莓派开机启动mysql后自动运行python脚本

python - python 中本地 https 服务器上的 SSL 异常

python - 将一个列表中的当前元素与另一个列表中的下一个元素进行比较

Python 查找满足特定条件的列表列表的子集

python - 是否可以在 python 中使用 NetworkX 控制节点绘制的顺序?

python - 如何向箱线图异常值添加注释

python - 你如何将 bz2 分配给 python 的 altinstall?

python - 如何在networkx.draw_networkx中获取颜色条?

matplotlib - 使用散点数据集 python matplotlib 的热图

python - pyplot : Can I set a global marker size parameter?