【问题标题】:Python side by side matplotlib boxplots with colorsPython并排matplotlib箱线图与颜色
【发布时间】:2019-03-03 07:31:13
【问题描述】:

我按照link 上的示例介绍了如何创建带颜色的箱线图。 我一直在尝试不同的方法将这些箱线图分隔在两个不同的位置,而不是它们都重叠但无济于事。如果我为它们指定不同的位置,它们将保持在 bp2 位置。如何将这两个箱线图并排放置?

import matplotlib.pyplot as plt

def color_boxplot(data, color):
   bp = boxplot(data, patch_artist=True,  showmeans=True)
   for item in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
        plt.setp(bp[item], color=color)


data1 = [1, 2, 3, 4, 5]
data2 = [4, 5, 6, 7, 8]
fig, ax = plt.subplots()
bp1 = color_boxplot(data1, 'green')
bp2 = color_boxplot(data2, 'red')
plt.show()

编辑:添加示例数据。

【问题讨论】:

  • 能否提供一些示例数据,以便我们运行代码

标签: python matplotlib boxplot


【解决方案1】:

为了使您的代码基本保持原样,您只需为函数的位置添加另一个参数。

import matplotlib.pyplot as plt

def color_boxplot(data, color, pos=[0], ax=None):
    ax = ax or plt.gca()
    bp = ax.boxplot(data, patch_artist=True,  showmeans=True, positions=pos)
    for item in ['boxes', 'whiskers', 'fliers', 'medians', 'caps']:
        plt.setp(bp[item], color=color)


data1 = [1, 2, 3, 4, 5]
data2 = [4, 5, 6, 7, 8]
fig, ax = plt.subplots()
bp1 = color_boxplot(data1, 'green', [1])
bp2 = color_boxplot(data2, 'red', [2])
ax.autoscale()
ax.set(xticks=[1,2], xticklabels=[1,2])
plt.show()

【讨论】:

  • 不错的答案。关于添加图例的任何想法?
【解决方案2】:

虽然我确实认为Sasha's answer 可能是在这种情况下的最佳选择,但如果你真的想保持原始帖子的外观,你必须修改你的代码,以便你只使用一次对 boxplot 的调用。这样,matplotlib 负责将它们正确定位在轴上。然后你可以遍历 boxplot 返回的字典来调整输出

data1 = [1, 2, 3, 4, 5]
data2 = [4, 5, 6, 7, 8]
data3 = [0, 1, 2]
data = [data1,data2, data3]
colors = ['red','green','blue']
fig, ax = plt.subplots()
box_dict = ax.boxplot(data, patch_artist=True,  showmeans=True)
for item in ['boxes', 'fliers', 'medians', 'means']:
    for sub_item,color in zip(box_dict[item], colors):
        plt.setp(sub_item, color=color)
# whiskers and caps have to be treated separately since there are two of each for each plot
for item in ['whiskers', 'caps']:
    for sub_items,color in zip(zip(box_dict[item][::2],box_dict[item][1::2]),colors):
        plt.setp(sub_items, color=color)

【讨论】:

    【解决方案3】:

    使用 seaborn 的预制boxplot 怎么样?

    import seaborn as sns
    sns.boxplot(data=[data1, data2])
    

    如果您想手动选择颜色,可以使用 xkcd color list:

    sns.boxplot(
        data=[data1, data2],
        palette=[sns.xkcd_rgb["pale red"], sns.xkcd_rgb["medium green"]],
        showmeans=True,
    )
    

    【讨论】:

    • 使用 seaborn 为这些箱线图上色会更容易吗?这就是我一直在苦苦挣扎的唯一原因。
    • @Gabriele 默认情况下,这两个箱线图的颜色不同。您需要手动选择颜色吗?
    • 快速谷歌搜索并没有告诉我如何使用 seaborn 显示每个箱线图中的平均值。它与 matplotlib 中的 showmeans=True 不同。
    • 我不是一个聪明人。谢谢,萨沙!
    • @Gabriele 一般来说,您可以期望对 matplotlib 有效的参数对 seaborn 中的类似绘图函数有效。它们在 seaborn 文档中被标记为 **kwargs
    猜你喜欢
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2017-12-12
    相关资源
    最近更新 更多