【发布时间】:2019-06-26 17:59:50
【问题描述】:
我有一个如下所示的数据框:
Team Minute Type
148 12 1
148 22 1
143 27 1
148 29 1
143 32 1
143 32 1
我使用Python库joypy创建了一个joyplot
fig, axes = joypy.joyplot(df, by="Team", column="Minute", figsize =(10,16), x_range = [0,94], linewidth = 1, colormap=plt.cm.viridis)
这给了我这个情节:
一切都好。
但是,颜色图现在没有意义了,所以我试图根据第二个数据框为图着色 - 这是所有团队的 Type 的总和。
为此,我使用这些行创建了一个规范和一个颜色图:
norm = plt.Normalize(group_df["Type"].min(), group_df["Type"].max())
cmap = plt.cm.viridis
sm = matplotlib.cm.ScalarMappable(cmap=cmap, norm=norm)
ar = np.array(group_df["Type"])
Cm = cmap(norm(ar))
sm.set_array([])
这就是问题出现的地方,因为我不知道如何更改欢乐图的颜色。我尝试了几种方法:
-
我尝试将此
Cm作为颜色图参数传递。但是,这引发了一个错误 -typeerror 'numpy.ndarray' object is not callable -
我尝试在
axes和Cm上使用 for 循环 -
for col, ax in zip(Cm, axes):
ax.set_facecolor(col)
#ax.patch.set_facecolor(col) ##Also tried this; didn't change anything
我怎样才能更好地控制joyplot的颜色并改变它们?任何帮助将不胜感激。
MCVE
我正在读取的 csv 文件示例(数据框的实际形状为 (4453,2)):
Team Minute
0 148 5
1 148 5
2 148 11
3 148 11
4 148 12
5 148 22
6 143 27
我的代码:
df = pd.read_csv(r"path")
##getting the sum for every team - total of 20 teams
group_df = df.groupby(["Team"]).size().to_frame("Count").reset_index()
df["Minute"] = pd.to_numeric(df["Minute"])
##Trying to create a colormap
norm = plt.Normalize(group_df["Count"].min(), group_df["Count"].max())
cmap = plt.cm.viridis
sm = matplotlib.cm.ScalarMappable(cmap=cmap, norm=norm)
ar = np.array(group_df["Count"])
Cm = cmap(norm(ar))
sm.set_array([])
fig, axes = joypy.joyplot(df, by="Team", column="Minute", figsize =(10,16), x_range = [0,94], colormap = plt.cm.viridis)
我想根据group_df["Count"] 值中的团队总数为图中的每个子图着色。目前,颜色图只是统一的,而不是根据总值。上图就是制作出来的。
【问题讨论】:
-
您可能会成功地为
joyplot提供颜色列表而不是颜色图。如果没有,手动创建这种情节可能更容易,您可以完全控制所有内容,而不仅仅是颜色。 -
再次感谢您,看来它可能会成功。如何手动创建这种情节?我认为 Joypy 是唯一可用于创建欢乐图的软件包。不过我还是很好奇。为什么 ax.set_facecolor() 不起作用;这是一个错误吗?
-
例如:here
-
ax.set_facecolor()设置轴的颜色,所以它没有帮助。您看不到它有任何影响的原因是轴无论如何都已关闭。如果您提供一个我可以修改的运行示例(minimal reproducible example、How to make good reproducible pandas examples),我可以为您提供更多帮助。 -
我刚刚这样做了,这样可以吗? @ImportanceOfBeingErnest
标签: python matplotlib visualization ridgeline-plot