Использование легенд Хлайнса в Matplotlib - PullRequest
0 голосов
/ 12 февраля 2019

Я изо всех сил пытаюсь настроить легенду своего графика после добавления оси / линии на уровне 100 на графике. (Скриншот добавлен)

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

добавив код здесь, возможно, я не пишу это правильно.

fig, ax1 = plt.subplots(figsize = (9,6),sharex=True)

BundleFc_Outcome['Spend'].plot(kind = 'bar',color = 'blue',width = 0.4, ax = ax1,position = 1)
#
# Make the y-axis label, ticks and tick labels match the line color.
ax1.set_ylabel('SPEND', color='b', size = 18)
ax1.set_xlabel('Bundle FC',color='w',size = 18)

ax2 = ax1.twinx()
ax2.set_ylabel('ROAS', color='r',size = 18)
ax1.tick_params(axis='x', colors='w',size = 20)
ax2.tick_params(axis = 'y', colors='w',size = 20)
ax1.tick_params(axis = 'y', colors='w',size = 20)
#ax1.text()
#

ax2.axhline(100)
BundleFc_Outcome['ROAS'].plot(kind = 'bar',color = 'red',width = 0.4, ax = ax2,position = 0.25)
plt.grid()
#ax2.set_ylim(0, 4000)
ax2.set_ylim(0,300)
plt.title('ROAS & SPEND By Bundle FC',color = 'w',size= 20)
plt.legend([ax2,ax1],labels = ['SPEND','ROAS'],loc = 0)

Код дает мне следующую картину:

result of above code

После реализации предложения в комментариях картинка выглядит так (не решает проблему):

result after changing legend location

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Итак, наконец, понял, что по какой-то причине было проще Даже удалось добавить еще один порог на уровне 2 для минимальных затрат.enter image description here

fig, ax1 = plt.subplots(figsize = (9,6),sharex=True)

BundleFc_Outcome['Spend'].plot(kind = 'bar',color = 'blue',width = 0.4, ax = ax1,position = 1)
#
# Make the y-axis label, ticks and tick labels match the line color.
ax1.set_ylabel('SPEND', color='b', size = 18)
ax1.set_xlabel('Region',color='w',size = 18)

ax2 = ax1.twinx()

ax2.set_ylabel('ROAS', color='r',size = 18)
ax1.tick_params(axis='x', colors='w',size = 20)
ax2.tick_params(axis = 'y', colors='w',size = 20)
ax1.tick_params(axis = 'y', colors='w',size = 20)
#ax1.text()
#
BundleFc_Outcome['ROAS'].plot(kind = 'bar',color = 'red',width = 0.4, ax = ax2,position = 0.25)
plt.grid()
#ax2.set_ylim(0, 4000)
ax2.set_ylim(0,300)
plt.title('ROAS & SPEND By Region',color = 'w',size= 20)
fig.legend([ax2,ax1],labels = ['SPEND','ROAS'],loc = 0)
plt.hlines([100,20],xmin = 0,xmax = 8,color= ['r','b'])
0 голосов
/ 12 февраля 2019

Я не рекомендую использовать встроенные функции панд для более сложной прорисовки.Кроме того, когда задаете вопрос, вежливым примером является минимальный и проверяемый пример (см. здесь ).Я позволил себе смоделировать вашу проблему.

Из-за изменения осей нам нужно создать собственную легенду.Первые результаты:

enter image description here

Что может быть достигнуто с помощью:

import matplotlib.pyplot as plt, pandas as pd, numpy as np
# generate dummy data.
X  = np.random.rand(10, 2)
X[:,1] *= 1000
x  = np.arange(X.shape[0]) * 2 # xticks
df = pd.DataFrame(X, columns = 'Spend Roast'.split())
# end dummy data

fig, ax1 = plt.subplots(figsize = (9,6),sharex=True)
ax2 = ax1.twinx()

# tmp axes
axes = [ax1, ax2] # setup axes
colors = plt.cm.tab20(x)
width = .5 # bar width

# generate dummy legend
elements = []
# plot data
for idx, col in enumerate(df.columns):
    tax = axes[idx]
    tax.bar(x + idx * width, df[col], label = col, width = width, color = colors[idx])
    element = tax.Line2D([0], [0], color = colors[idx], label = col) # setup dummy label
    elements.append(element)
# desired hline
tax.axhline(200, color = 'red')
tax.set(xlabel = 'Bundle FC', ylabel = 'ROAST')
axes[0].set_ylabel('SPEND')
tax.legend(handles = elements)
0 голосов
/ 12 февраля 2019

Вы можете использовать атрибут bbox_to_anchor для ручной установки местоположения легенды.

ax1.legend([ax1],labels = ['SPEND'],loc='upper right', bbox_to_anchor=(1.25,0.70))
plt.legend([ax2,ax1],labels = ['SPEND','ROAS'],loc='upper right', bbox_to_anchor=(1.25,0.70))

https://matplotlib.org/users/legend_guide.html#legend-location

...