Это относится к следующему вопросу, в котором обсуждаются варианты настройки заголовка и компоновки подзаголовков: изменение выходных данных pandas boxplot
Мое требование состоит в том, чтобы изменить цвета отдельных ящиков в каждом подзаголовке (как показано ниже):
Ниже приведен код, доступный по общей ссылке для настройки свойств заголовка и оси подзаголовков:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
bp = df.boxplot(by="models",layout=(4,1),figsize=(6,8))
[ax_tmp.set_xlabel('') for ax_tmp in np.asarray(bp).reshape(-1)]
fig = np.asarray(bp).reshape(-1)[0].get_figure()
fig.suptitle('New title here')
plt.show()
Я попытался использовать свойство: ax.set_facecolor ('color'), но не удалось получить желаемый результат.
Я попытался получить доступ к bp ['boxes'], но, видимо, он недоступен. Мне нужно некоторое представление о структуре данных, хранящихся в bp, для доступа к отдельным ящикам в подзаголовке.
Жду с нетерпением
PS: Я знаю морского обитателя. Но нужно понимать и реализовывать с использованием df.boxplot в настоящее время. Спасибо
Чтобы настроить цвета ваших полей в pandas.boxplot
, вам нужно немного изменить свой код. Прежде всего, вы должны сказать boxplot
чтобы на самом деле заполнить поля цветом. Вы делаете это, указав patch_artist = True
, как patch_artist = True
здесь. Однако кажется, что вы не можете указать цвет (по умолчанию синий) - пожалуйста, кто-нибудь меня исправит, если я ошибаюсь. Это означает, что вам нужно изменить цвет потом. К счастью, pandas.boxplot
предлагает простой вариант, чтобы получить художников в boxplot как возвращаемое значение, указав return_type = 'both'
увидеть здесь объяснение. Вы получаете pandas.Series
с ключами в соответствии с вашими столбцами DataFrame
и значениями, которые являются кортежами, содержащими экземпляры Axes
на которых вырисовываются ящики, и фактические элементы ящиков в словаре. Я думаю, что код довольно понятен:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import PathPatch
df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1','model2', 'model3', 'model4', 'model5', 'model6', 'model7'], 20))
bp_dict = df.boxplot(
by="models",layout=(4,1),figsize=(6,8),
return_type='both',
patch_artist = True,
)
colors = ['b', 'y', 'm', 'c', 'g', 'b', 'r', 'k', ]
for row_key, (ax,row) in bp_dict.iteritems():
ax.set_xlabel('')
for i,box in enumerate(row['boxes']):
box.set_facecolor(colors[i])
plt.show()
Получившийся сюжет выглядит следующим образом:
Надеюсь это поможет.
Хотя вы называете возврат df.boxplot
bp
, это действительно (n) (массив) осей. Проверка осей, чтобы получить отдельные части коробки, громоздка (но возможна).
Во-первых, чтобы иметь возможность раскрасить внутреннюю часть ящиков, вам нужно повернуть коробки на патчи, df.boxplot(..., patch_artist=True)
.
Тогда вам нужно будет найти ящики внутри всех художников в осях.
# We want to make the 4th box in the second axes red
axes[1].findobj(matplotlib.patches.Patch)[3].set_facecolor("red")
Полный код:
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(140, 4), columns=['A', 'B', 'C', 'D'])
df['models'] = pd.Series(np.repeat(['model1', 'model2', 'model3', 'model4',
'model5', 'model6', 'model7'], 20))
axes = df.boxplot(by="models", layout=(len(df.columns)-1,1), figsize=(6,8), patch_artist=True)
for ax in axes:
ax.set_xlabel('')
# We want to make the 4th box in the second axes red
axes[1].findobj(matplotlib.patches.Patch)[3].set_facecolor("red")
fig = axes[0].get_figure()
fig.suptitle('New title here')
plt.show()