#python #matplotlib #sharing
#python #matplotlib #совместное использование
Вопрос:
После многих сражений и просмотра обучающих программ на YouTube я смог достичь своей цели — создать окно рисунка с уникальным именем и 4 подзаголовками.
Метод, который я использовал, был add_subplot
потому что я лучше понимаю код, чем метод распаковки кортежей, т.е. рис. , …
Последнее, что я пытаюсь сделать, это поделиться своей осью x, и после долгих игр, т. Е. попыток вставить код sharex="Cols"
или sharex = True
, я не добился успеха.
Мой полный код выглядит следующим образом:-
import pandas
import numpy
from matplotlib import pyplot
x = numpy.linspace(0, 2*numpy.pi, 400)
y = numpy.sin(x**2)
yy = numpy.sin(x**2 3)
My_Figure_Window = pyplot.figure("Title Of Figure Window")
pyplot.style.use("ggplot")
My_Figure_Window.suptitle("Main Title")
Sub_Plot_Rows = 4
Sub_Plot_Cols = 1
Wall = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 1)
Wall.plot(x, y, color="r", label='Line 1')
Wall.plot(x, yy, color="b", label='Line 2')
pyplot.ylabel("Ylabel")
Wall.get_legend_handles_labels()
pyplot.legend()
pyplot.show()
Sidewalk = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 2)
Sidewalk.plot(x, y, label='Line 3')
Sidewalk.plot(x, yy, label='Line 4')
pyplot.ylabel("Ylabel")
Sidewalk.get_legend_handles_labels()
pyplot.legend()
pyplot.show()
HeadWall = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 3)
HeadWall.plot(x, y, label='Line 5')
HeadWall.plot(x, yy, label='Line 6')
pyplot.ylabel("Ylabel")
HeadWall.get_legend_handles_labels()
pyplot.legend()
pyplot.show()
SideTank = My_Figure_Window.add_subplot(Sub_Plot_Rows, Sub_Plot_Cols, 4)
SideTank.plot(x, y, label='Line 7')
SideTank.plot(x, yy, label='Line 8')
pyplot.ylabel("Ylabel")
SideTank.get_legend_handles_labels()
pyplot.legend()
pyplot.show()
Может кто-нибудь просто указать мне правильное направление относительно того, где / как я могу поделиться своей осью X для всех этих подзаголовков?
Кстати, я понял, что код pyplot.show()
никак не влияет, но все его включают?
Комментарии:
1. В качестве дополнительного примечания
SideTank.get_legend_handles_labels()
сам по себе ничего не делает: он возвращает объекты, которые вы можете передать другому вызову legend. Как правило, достаточно просто вызвать axes.legend(), который, как я полагаю, вызывает get_legend_handle_labels(): matplotlib.org/3.1.1/api/_as_gen /…2. Вам нужно вызвать
pyplot.show()
только один раз в конце вашего кода. Вот рабочий пример.
Ответ №1:
Существует два основных способа использования matplotlib. Первый — это pyplot API с отслеживанием состояния, где вы выполняете вызовы типа pyplot.legend()
, а другой — объектно-ориентированный API, где вы выполняете вызовы типа `SideTank.get_handle_labels(). Оба хороши, но их слишком сильное смешивание иногда приводит к путанице. Это проблема в вашем случае. Например,
SideTank.get_legend_handles_labels()
pyplot.legend()
Первый вызов является частью OO API, второй — pyplot. Вы, вероятно, захотите использовать, SideTank.legend()
если вы используете OO API, и pyplot.legend()
только если вы используете Pyplot API.
Если вы хотите использовать pyplot API:
- https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.html это мощная ссылка.
Если вы хотите использовать OO API:
- https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.figure.Figure.html
- https://matplotlib.org/3.1.1/api/axes_api.html#matplotlib.axes.Axes
Вот несколько способов создания сдвоенных осей:
# This will create a Figure and a list of 4 axes objects. All of those axes objects will have sharex X axes
figure, axes = pyplot.subplots(nrows=4, sharex=True)
axes[0].plot((0, 1), (0, 1))
axes[1].plot((0, 2), (0, 1))
axes[2].plot((0, 0.5), (0, 1))
axes[3].plot((1, 1.5), (0, 1))
# Create a figure
fig = pyplot.figure()
# Use that figure to create a first subplot
ax1 = fig.add_subplot(4, 1, 1)
# Make the following subplots twin that subplot's x axis.
ax2 = fig.add_subplot(4, 1, 2, sharex = ax1)
ax3 = fig.add_subplot(4, 1, 3, sharex = ax1)
ax4 = fig.add_subplot(4, 1, 4, sharex = ax1)
ax1.plot((0, 1), (0, 1))
ax2.plot((0, 2), (0, 1))
ax3.plot((0, 0.5), (0, 1))
ax4.plot((1, 1.5), (0, 1))
Если вы хотите использовать pyplot API, это будет выглядеть примерно так.
# Create a current figure and subplot
pyplot.figure()
pyplot.subplot(4, 1, 1)
# Plot something in the current subplot
pyplot.plot((0, 1), (0, 1))
# short for "get current axes"
# This returns an Axis, so we're dipping into the OO API; it's not uncommon to need to
# do that to do more advanced things, but it's a signal to be careful!
share_handle = pyplot.gca()
# Select a new subplot, and tell it to share its x axis with the first subplot.
pyplot.subplot(4, 1, 2, sharex = share_handle)
pyplot.plot((0, 2), (0, 1))
pyplot.subplot(4, 1, 3, sharex = share_handle)
pyplot.plot((0, 0.5), (0, 1))
pyplot.subplot(4, 1, 4, sharex = share_handle)
pyplot.plot((1, 1.5), (0, 1))
Все это создаст что-то вроде следующего:
На вашем вторичном вопросе pyplot.show()
отображаются цифры, а не подзаголовки. Таким образом, вы, вероятно, захотите вызвать его только один раз, когда закончите настройку всего рисунка.