Python 如何更改joypy plot中的颜色映射?
我有一个数据框,看起来像这样:Python 如何更改joypy plot中的颜色映射?,python,matplotlib,visualization,ridgeline-plot,Python,Matplotlib,Visualization,Ridgeline Plot,我有一个数据框,看起来像这样: Team Minute Type 148 12 1 148 22 1 143 27 1 148 29 1 143 32 1 143 32 1 我使用Python库创建了一个joyplot 这给了我这个情节: 一切都好。 然而,彩色地图现在已经没有意义了,所以我尝试根据第二个数据帧来给图上色-这是所有团队的Typ
Team Minute Type
148 12 1
148 22 1
143 27 1
148 29 1
143 32 1
143 32 1
我使用Python库创建了一个joyplot
这给了我这个情节:
一切都好。
然而,彩色地图现在已经没有意义了,所以我尝试根据第二个数据帧来给图上色-这是所有团队的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
作为colormap参数传递。但是,这引发了一个错误-typeerror'numpy.ndarray'对象不可调用
轴和Cm轴上使用for循环-
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”]
值中团队的总计数为绘图中的每个子地块上色。目前,colormap只是统一的,而不是根据总值。上面的图片就是所产生的。joypy按照颜色贴图的顺序填充KDE曲线的颜色。因此,为了使颜色与第三个变量匹配,您可以提供一个colormap,它按照您需要的顺序包含颜色。这可以使用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()
joypy从colormap按顺序填充KDE曲线的颜色。因此,为了使颜色与第三个变量匹配,您可以提供一个colormap,它按照您需要的顺序包含颜色。这可以使用
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()
您可能会成功地为
joyplot
提供颜色列表,而不是颜色映射。如果没有,创建这种绘图可能更容易手动完成,您可以完全控制所有内容,而不仅仅是颜色。再次感谢您,这看起来可能会成功。如何手动创建此类绘图?我认为Joypy是唯一可以用来创建joyplots的软件包。不过我还是很好奇。为什么ax.set_facecolor()不起作用;这是一个错误吗?例如:ax.set\u facecolor()
设置轴的颜色,因此它不会有帮助。你看不到它有任何效果的原因是轴无论如何都是关闭的。如果你提供了一个我可以修改的运行示例(,),我可以帮你更多。我刚刚做了,这样可以吗@importantanceofbeingernest您可能成功地为joyplot
提供了颜色列表,而不是颜色映射。如果没有,创建这种绘图可能更容易手动完成,您可以完全控制所有内容,而不仅仅是颜色。再次感谢您,这看起来可能会成功。如何手动创建此类绘图?我认为Joypy是唯一可以用来创建joyplots的软件包。不过我还是很好奇。为什么ax.set_facecolor()不起作用;这是一个错误吗?例如:ax.set\u facecolor()
设置轴的颜色,因此它不会有帮助。你看不到它有任何效果的原因是轴无论如何都是关闭的。如果你提供了一个我可以修改的运行示例(,),我可以帮你更多。我刚刚做了,这样可以吗@重要的,重要的
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)
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()