Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何更改joypy plot中的颜色映射?_Python_Matplotlib_Visualization_Ridgeline Plot - Fatal编程技术网

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循环-

  • 我怎样才能更好地控制joyplot的颜色并改变它们?任何帮助都将不胜感激

    MCVE 我正在读取的csv文件示例(数据帧的实际形状为(4453,2)):

    我的代码:

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