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