установить полную границу легенды рисунка и проблему с недискретным значением x - PullRequest
0 голосов
/ 11 декабря 2018

Мне бы хотелось иметь многострочную фигуру с кадром данных.

Исходные данные выглядят следующим образом:

from numpy.random import randn
import numpy as np

df=pd.DataFrame()
df['Years']=range(1995,2013)
np.random.seed(0)
df['Goverment']=randn(len(df.Years))
df['Household']=randn(len(df.Years))
df['Corporate']=randn(len(df.Years))
print(df)

, и я хочу установить легенду вдоль полностью связанной рамки фигуры.Я сослался на ответ @ Джо Кингтон , но эта проблема не была решена.

Для черчения:

import matplotlib.pyplot as plt
fig = plt.figure(figsize=(10,6))
ax = plt.subplot(111)
ax.plot(df.Years, df.Government,ls='--',label='Goverment',color='black')
ax.plot(df.Years,df.Household,ls=':',label='Household',color='black')
ax.plot(df.Years,df.Corporate,ls='-',label='Corporate',color='black')
plt.xlabel("common X")

box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
                 box.width, box.height * 1])

# Put a legend below current axis
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.1),borderaxespad=1,mode='expand',ncol=3)
plt.show()

и мой результат приведен ниже.Видимо mode='expand' здесь не работает.enter image description here

Мои вопросы: 1. Почему значения на оси X не являются целыми числами, а плавают?2. Как развернуть поле легенды в одну строку по всей длине вдоль границы поля?


Идеальное поле легенды должно быть:

enter image description here

1 Ответ

0 голосов
/ 11 декабря 2018

Разница действительно в том, что вы используете mode='expand'.Теперь это скажет легенде расширяться в ее ограничительной рамке.Однако ограничивающая рамка не имеет протяженности, это единая точка.Легенда, следовательно, будет расширяться внутри прямоугольника с нулевой шириной и, следовательно, станет самой нулевой шириной.

Решение состоит в том, чтобы указать ограничивающий прямоугольник с 4 координатами (т.е. истинный прямоугольник).В принципе это также должно быть объяснено в моем ответе на связанный вопрос .Таким образом, здесь мы будем использовать координаты осей для bbox_transform и сделать блок на одну единицу в координатах осей шириной.

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(10)

fig = plt.figure()
fig.subplots_adjust(bottom=0.2, top=0.95)
ax = plt.subplot(111)

for i in range(5):
    line, = ax.plot(x, i * x, label='$y = %ix$'%i)

# Put a legend below current axis
ax.legend(loc="upper center", mode='expand',
          bbox_to_anchor=(0,-0.2,1,.1), bbox_transform=ax.transAxes,
          fancybox=True, shadow=True, ncol=5)

plt.show()

enter image description here

...