繁体   English   中英

Matplotlib 3D 散点图 cmap

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM