如何更改 joypy plot 中的颜色图?
How to change colormap in joypy plot?
我有一个如下所示的数据框:
Team Minute Type
148 12 1
148 22 1
143 27 1
148 29 1
143 32 1
143 32 1
我使用 Python 库创建了一个欢乐情节 joypy
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([])
这里是问题出现的地方,因为我不知道如何更改 joyplots 的颜色。我尝试了几种方法:
我试图将此 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"]
值中的团队总数为图中的每个子图着色。目前,颜色图只是统一的,而不是根据总值。上图是制作出来的
joypy 从颜色图中按顺序填充 KDE 曲线的颜色。因此,为了使颜色与第三个变量匹配,您可以提供一个颜色图,其中包含按您需要的顺序排列的颜色。这可以使用 ListedColormap
.
来完成
import matplotlib
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(21)
import pandas as pd
import joypy
df = pd.DataFrame({"Team" : np.random.choice([143,148,159,167], size=200),
"Minute" : np.random.randint(0,100, size=200)})
##getting the sum for every team - total of 20 teams
group_df = df.groupby(["Team"]).size().to_frame("Count").reset_index()
print(group_df)
##Trying to create a colormap
norm = plt.Normalize(group_df["Count"].min(), group_df["Count"].max())
ar = np.array(group_df["Count"])
original_cmap = plt.cm.viridis
cmap = matplotlib.colors.ListedColormap(original_cmap(norm(ar)))
sm = matplotlib.cm.ScalarMappable(cmap=original_cmap, norm=norm)
sm.set_array([])
fig, axes = joypy.joyplot(df, by="Team", column="Minute", x_range = [0,94], colormap = cmap)
fig.colorbar(sm, ax=axes, label="Count")
plt.show()
我有一个如下所示的数据框:
Team Minute Type
148 12 1
148 22 1
143 27 1
148 29 1
143 32 1
143 32 1
我使用 Python 库创建了一个欢乐情节 joypy
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([])
这里是问题出现的地方,因为我不知道如何更改 joyplots 的颜色。我尝试了几种方法:
我试图将此
Cm
作为颜色图参数传递。但是,这引发了一个错误 -typeerror 'numpy.ndarray' object is not callable
我尝试在
上使用 for 循环axes
和Cm
-
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"]
值中的团队总数为图中的每个子图着色。目前,颜色图只是统一的,而不是根据总值。上图是制作出来的
joypy 从颜色图中按顺序填充 KDE 曲线的颜色。因此,为了使颜色与第三个变量匹配,您可以提供一个颜色图,其中包含按您需要的顺序排列的颜色。这可以使用 ListedColormap
.
import matplotlib
import matplotlib.pyplot as plt
import numpy as np; np.random.seed(21)
import pandas as pd
import joypy
df = pd.DataFrame({"Team" : np.random.choice([143,148,159,167], size=200),
"Minute" : np.random.randint(0,100, size=200)})
##getting the sum for every team - total of 20 teams
group_df = df.groupby(["Team"]).size().to_frame("Count").reset_index()
print(group_df)
##Trying to create a colormap
norm = plt.Normalize(group_df["Count"].min(), group_df["Count"].max())
ar = np.array(group_df["Count"])
original_cmap = plt.cm.viridis
cmap = matplotlib.colors.ListedColormap(original_cmap(norm(ar)))
sm = matplotlib.cm.ScalarMappable(cmap=original_cmap, norm=norm)
sm.set_array([])
fig, axes = joypy.joyplot(df, by="Team", column="Minute", x_range = [0,94], colormap = cmap)
fig.colorbar(sm, ax=axes, label="Count")
plt.show()