У меня есть сюжет с двумя осями Y, используя twinx()
. Я также даю метки линиям и хочу показать их с помощью legend()
, но мне удается получить метки только одной оси в легенде:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rc
rc('mathtext', default='regular')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(time, Swdown, '-', label = 'Swdown')
ax.plot(time, Rn, '-', label = 'Rn')
ax2 = ax.twinx()
ax2.plot(time, temp, '-r', label = 'temp')
ax.legend(loc=0)
ax.grid()
ax.set_xlabel("Time (h)")
ax.set_ylabel(r"Radiation ($MJ\,m^{-2}\,d^{-1}$)")
ax2.set_ylabel(r"Temperature ($^\circ$C)")
ax2.set_ylim(0, 35)
ax.set_ylim(-20,100)
plt.show()
Поэтому я получаю только метки первой оси в легенде, а не метку 'temp' второй оси. Как я могу добавить этот третий ярлык к легенде?
python
matplotlib
axis
legend
Джорис
источник
источник
ax
в стиле, в котором я используюax2
: in твой случайax.plot([], [], '-r', label = 'temp')
. Это намного быстрее и проще, чем делать это правильно ...Ответы:
Вы можете легко добавить вторую легенду, добавив строку:
Вы получите это:
Но если вы хотите, чтобы все надписи были на одной легенде, вы должны сделать что-то вроде этого:
Что даст вам это:
источник
errorbar
графиками. Для решения, которое правильно обрабатывает их, см. Ниже: stackoverflow.com/a/10129461/1319447ax1
. В этом случае используйте,lns1=ax1.lines
а затем добавьтеlns2
в этот список.loc
объяснены здесьЯ не уверен, что эта функциональность является новой, но вы также можете использовать метод get_legend_handles_labels () вместо того, чтобы отслеживать строки и метки самостоятельно:
источник
errorbar
графиками, в то время как принятый отказывает (показывая строку и ее строки ошибок отдельно, и ни один из них с правильной меткой). Плюс это проще.ax2
и у него нет сета с самого началаНачиная с версии 2.1 от matplotlib, вы можете использовать легенду фигуры . Вместо того
ax.legend()
, чтобы создать легенду с ручками от осейax
, можно создать легенду фигурыкоторый соберет все ручки со всех участков на рисунке. Поскольку это легенда фигуры, она будет размещена в углу фигуры, и
loc
аргумент будет относиться к фигуре.Чтобы поместить легенду обратно в оси, нужно указать a
bbox_to_anchor
и abbox_transform
. Последним будет преобразование осей осей, в которых должна находиться легенда. Первым могут быть координаты ребра,loc
заданные в координатах осей.источник
conda upgrade matplotlib
найти более новые версии, я все еще использую v.2.0.2Вы можете легко получить то, что вы хотите, добавив строку в топоре:
или
Это ничего не изменит, но добавит метку к легенде об топоре.
Я думаю, что это гораздо проще. Нет необходимости автоматически отслеживать линии, когда у вас есть только несколько линий на вторых осях, так как ручная фиксация, как описано выше, будет довольно простой. Во всяком случае, это зависит от того, что вам нужно.
Весь код как показано ниже:
Сюжет как ниже:
Обновление: добавьте лучшую версию:
Это ничего не сделает, в то время как
plot(0, 0)
может изменить диапазон оси.Еще один дополнительный пример для разброса
источник
Быстрый взлом, который может удовлетворить ваши потребности ..
Снимите рамку коробки и вручную расположите две легенды рядом друг с другом. Что-то вроде этого..
Где кортеж loc - это проценты слева направо и снизу вверх, которые представляют местоположение на диаграмме.
источник
Я нашел следующий официальный пример matplotlib, который использует host_subplot для отображения нескольких осей Y и всех различных меток в одной легенде. Обходной путь не требуется. Лучшее решение, которое я нашел до сих пор. http://matplotlib.org/examples/axes_grid/demo_parasite_axes2.html
источник