Python бок о бок matplotlib boxplts с цветами - PullRequest
0 голосов
/ 27 сентября 2018

Я следовал примерам по этой ссылке о том, как создать коробку с цветами.Я пробовал разные способы разделить эти боксы на две разные позиции вместо того, чтобы они совпали, но безрезультатно.Если я укажу разные позиции для них обоих, они останутся на позиции 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 голосов
/ 27 сентября 2018

Хотя я думаю, ответ Саши , вероятно, является наилучшим выбором, учитывая обстоятельства, но если вы действительно хотите сохранить вид вашего исходного поста, вам нужно изменить код так, чтобы вы использовали только одинпозвонить в коробку.Таким образом, matplotlib заботится о правильном расположении их на осях.Затем вы можете перебрать словарь, возвращаемый блокпостом, чтобы скорректировать вывод

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

0 голосов
/ 27 сентября 2018

Чтобы сохранить ваш код в основном нетронутым, вы можете просто добавить еще один аргумент для позиции в вашей функции.

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

0 голосов
/ 27 сентября 2018

Как насчет использования готового коробочного участка от seaborn?

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

Если вы хотите выбрать цвета вручную, вы можете использовать список цветов xkcd :

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

enter image description here

...