[英]Matplotlib 3D scatterplot cmap
**编辑以添加示例数据
我有一个 dataframe,我用它来制作 3d 散点图 plot。
两列包含我想要转换为点属性的信息。
列 Exp 是该点属于哪个系列 - 有 7 个。每个系列有 9 个点 - 这是 Day 列,范围从 0 到 8。
我希望每个系列都是不同的颜色——下面的代码很好,但我希望每一天都是一个 alpha,这样它们 go 来自 0=light 8=dark。
或者,如果每个系列都有一个唯一的顺序色图,其中渐变取自日列中的值,那也可以。
令人沮丧的简单,但我不太明白。 任何帮助适用。
anp = df.loc[:, 'Exp'].values
set_res = set(anp)
list_res = (list(set_res))
d = df.loc[:, 'Day'].values
set_d = set(d)
list_d = (list(set_d))
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(111, projection='3d')
ax.set_xlabel('X', fontsize = 15)
ax.set_ylabel('Y', fontsize = 15)
ax.set_zlabel('Z', fontsize = 15)
ax.set_title('3D', fontsize = 20)
colors = ['r','g','y','b','m','k','c']
for target, color, day in zip(list_res,colors,list_d):
indicesToKeep = df['Exp'] == target
indicesToKeep = df['Day'] == day
ax.scatter(data.loc[indicesToKeep, 'X']
, data.loc[indicesToKeep, 'Y']
, data.loc[indicesToKeep, 'Z']
, c = color
, alpha = day
, s = 10)
ax.legend(list_res)
ax.grid()
plt.show()
X Y Z Day Exp
0 6.065799089 5.39606408 0.20680998 0 Exp1
1 -1.813171466 -0.14416587 1.152384796 1 Exp1
2 -3.676586344 1.358197191 0.882998403 2 Exp1
3 -5.074761537 2.214899107 -0.198255954 3 Exp1
4 -5.235090681 2.548416921 0.289574373 5 Exp1
5 -5.486962521 2.437908275 -0.496139886 4 Exp1
6 -5.939524094 2.939749551 -0.825422951 6 Exp1
7 -6.380253741 2.976652955 -1.3211511 7 Exp1
8 -5.952184603 2.80820602 -1.08558843 8 Exp1
9 6.501631702 6.755084113 0.056963689 0 Exp2
10 2.141323206 -2.942530182 0.276459756 1 Exp2
11 1.799786018 -2.761261089 -0.03426698 2 Exp2
12 1.58787416 -2.73071711 0.134785134 3 Exp2
13 1.731188598 -2.783161946 0.168444894 4 Exp2
14 1.959546043 -2.860391099 0.735327034 5 Exp2
15 1.763603911 -2.742837672 0.060296845 6 Exp2
16 1.84718194 -2.785950848 0.236620814 7 Exp2
17 1.986642504 -2.541517762 -0.773824298 8 Exp2
我正在研究类似于提出的案例的图表。 我认为这可以帮助:
fig = plt.figure(figsize = (12,12))
ax = fig.add_subplot(111, projection='3d')
#colors = ['r', 'g', 'y', 'b','m','k','c']
colors_dict = {"Exp1":'r', "Exp2":'g', "Exp3":'y', "Exp4":'b', "Exp5":'m', "Exp6":'k', "Exp7":'c'}
ax.set_xlabel('X', fontsize = 15)
ax.set_ylabel('Y', fontsize = 15)
ax.set_zlabel('Z', fontsize = 15)
ax.set_title('3D', fontsize = 20)
for i in df.index:
ax.scatter(df.X[i],
df.Y[i],
df.Z[i],
color = colors_dict[df.Exp[i]],
alpha = df.Day[i]/10,
label = df.Exp[i],
s=40)
# To avoid duplicated labels
handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys(), loc = 6)
plt.show()
另一种效果不错的解决方案是使用 df.groupby(),然后按名称和组进行迭代。
我希望它对你有用。 你好
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.