Python бок о бок matplotlib boxplts с цветами

1

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

EDIT: Добавлены данные образца.

Изображение 174551

  • 0
    Можете ли вы предоставить пример данных, чтобы мы могли запустить код
Теги:
matplotlib
boxplot

3 ответа

1
Лучший ответ

Как насчет использования готового ящика из морского дна?

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

Изображение 174551

  • 0
    Будет ли легче покрасить эти коробочки с помощью морского рожка? Это единственная причина, почему я так много боролся.
  • 0
    @Gabriele Два боксплота окрашены по-разному по умолчанию. Вам нужно вручную выбрать цвета?
Показать ещё 6 комментариев
2

Хотя я думаю, что ответ Саши, вероятно, лучший выбор, учитывая обстоятельства, если вы действительно хотите сохранить внешний вид своего оригинального сообщения, вам нужно изменить свой код, чтобы вы использовали только один вызов 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)

Изображение 174551

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

Изображение 174551

Ещё вопросы

Сообщество Overcoder
Наверх
Меню