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