1

我有一个如下所示的数据框:

  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([])

这就是问题出现的地方,因为我不知道如何更改欢乐图的颜色。我尝试了几种方法:

  1. 我试图将其Cm作为颜色图参数传递。但是,这引发了一个错误-typeerror 'numpy.ndarray' object is not callable

  2. 我尝试在axesand上使用 for 循环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"]。目前,颜色图只是统一的,而不是根据总值。上图是制作出来的。

4

1 回答 1

3

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()

在此处输入图像描述

于 2019-06-29T11:25:08.433 回答