代码之家  ›  专栏  ›  技术社区  ›  Kapil Sharma

更改熊猫箱线图的面颜色

  •  7
  • Kapil Sharma  · 技术社区  · 8 年前

    我需要更改使用绘制的箱线图的颜色 pandas 效用函数。我可以使用 color 参数,但无法确定如何更改 facecolor 盒子的。有人知道怎么做吗?

    import pandas as pd
    import numpy as np
    data = np.random.randn(100, 4)
    labels = list("ABCD")
    df = pd.DataFrame(data, columns=labels)
    props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
    df.plot.box(color=props)
    
    3 回复  |  直到 2 年前
        1
  •  13
  •   Paul H    8 年前

    虽然我仍然推荐海产的和未加工的matplotlib,而不是熊猫的绘图界面,但事实证明,您可以通过 patch_artist=True 作为一个笨蛋 df.plot.box ,将其作为kwarg传递给 df.plot ,这将作为一个夸格 matplotlib.Axes.boxplot .

    import pandas as pd
    import numpy as np
    data = np.random.randn(100, 4)
    labels = list("ABCD")
    df = pd.DataFrame(data, columns=labels)
    props = dict(boxes="DarkGreen", whiskers="DarkOrange", medians="DarkBlue", caps="Gray")
    df.plot.box(color=props, patch_artist=True)
    

    enter image description here

        2
  •  2
  •   Kapil Sharma    8 年前

    如前所述,我最终创建了一个函数来绘制此图,使用原始 matplotlib .

    def plot_boxplot(data, ax):
        bp = ax.boxplot(data.values, patch_artist=True)
    
        for box in bp['boxes']:
            box.set(color='DarkGreen')
            box.set(facecolor='DarkGreen')
    
        for whisker in bp['whiskers']:
            whisker.set(color="DarkOrange")
    
        for cap in bp['caps']:
            cap.set(color="Gray")
    
        for median in bp['medians']:
            median.set(color="white")
    
        ax.axhline(0, color="DarkBlue", linestyle=":")
    
        ax.set_xticklabels(data.columns)
    
        3
  •  0
  •   Marco Cerliani    2 年前

    我建议使用 df.plot.box 具有 patch_artist=True return_type='both' (它返回绘制箱线图的matplotlib轴和值为箱线图matplotlab行的字典),以便进行最佳定制。

    例如,给定此数据:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame(
        data=np.random.randn(100, 4), 
        columns=list("ABCD")
    )
    

    可以为设置特定颜色 所有的盒子 :

    fig,ax = plt.subplots(figsize=(9,6)) 
    ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
    for patch in props['boxes']:
        patch.set_facecolor('lime')
    plt.show()
    

    enter image description here

    可以为设置特定颜色 每个盒子 :

    colors = ['green','blue','yellow','red']
    
    fig,ax = plt.subplots(figsize=(9,6)) 
    ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
    for patch,color in zip(props['boxes'],colors):
        patch.set_facecolor(color)
    plt.show()
    

    enter image description here

    颜色表 :

    colors = np.random.randint(0,10, 4)
    cm = plt.cm.get_cmap('rainbow')
    colors_cm = [cm((c-colors.min())/(colors.max()-colors.min())) for c in colors]
    
    fig,ax = plt.subplots(figsize=(9,6)) 
    ax,props = df.plot.box(patch_artist=True, return_type='both', ax=ax)
    for patch,color in zip(props['boxes'],colors_cm):
        patch.set_facecolor(color)
    # to add colorbar
    fig.colorbar(plt.cm.ScalarMappable(
        plt.cm.colors.Normalize(min(colors),max(colors)), 
        cmap='rainbow'
    ), ax=ax, cmap='rainbow')
    plt.show()
    

    enter image description here