带有颜色的Python并排matplotlib箱线图

时间:2018-09-27 11:34:32

标签: python matplotlib boxplot

我遵循了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()

编辑:添加了示例数据。

enter image description here

3 个答案:

答案 0 :(得分: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)

enter image description here

答案 1 :(得分:2)

要使您的代码基本保持完整,您只需在函数中添加另一个用于位置的参数即可。

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

enter image description here

答案 2 :(得分:1)

如何使用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,
)

enter image description here