#python #matplotlib
#python #matplotlib
Вопрос:
Я создаю графики, используя цикл, и я хотел бы, чтобы эти графики разделяли свои оси x. Далее приведен пример кода. Конечно, val и функции для построения графика более сложны. Я бы хотел, чтобы все сюжетные линии разделяли оси x.
import matplotlib.pyplot as plt
import numpy as np
val = [0.1, 0.2, 0.3]
nplots = len(val)
plt.figure()
for i, alpha in enumerate(val):
plt.subplot(nplots,1,i 1)
plt.plot(np.linspace(0,1,100), a * np.linspace(0,1,100)**2)
plt.show()
Комментарии:
1. Что вы подразумеваете под «разделением осей x»? Вы явно создаете разные сюжетные линии. Если вы имеете в виду, чтобы они охватывали один и тот же экстент, вы можете явно установить их пределы с помощью xlim().
2. Каким будет ожидаемый результат?
3. Все оси x будут иметь одинаковую протяженность (из-за данных), но если графики имеют общие оси x, если я увеличу масштаб одного графика, он увеличит масштаб и в другом, и это поведение, которое я хотел бы получить.
Ответ №1:
Если я правильно понимаю вопрос, приведенный здесь пример рецепта может помочь:
http://matplotlib.org/examples/pylab_examples/shared_axis_demo.html
В вашем контексте, как это делается?
fig = plt.figure()
ax0 = plt.subplot(nplots,1,1)
plt.plot(np.linspace(0,1,100), a * np.linspace(0,1,100)**2)
for i, alpha in enumerate(val):
plt.subplot(nplots,1,i 2,sharex=ax0)
plt.plot(np.linspace(0,1,100), a * np.linspace(0,1,100)**2)
plt.show()
Редактировать:
Обновление моего собственного ответа более элегантным решением, которое может понравиться OP:
vals = np.linspace(0,1,3)
nplots = len(vals)
fig, axs = plt.subplots(nrows=nplots, ncols=1, sharex=True)
for i, alpha in enumerate(vals):
axs[i].plot(np.linspace(0,1,100), alpha * np.linspace(0,1,100)**2)
plt.show()
Комментарии:
1. Не совсем, моя проблема связана с циклом. Должен ли я создавать список объектов ax?
2. Я не думаю, что должно иметь значение, создаются ли подзаголовки в цикле или нет, но да, вам нужно будет сохранить ссылку на объекты ax, чтобы поделиться ими друг с другом.
3. Вероятно, достаточно просто сохранить первую для совместного использования с другими (как в примере)
4. Я добавил несколько примеров модов в ваш код, который, я думаю , делает то, что вы хотите
5. Он делает то, что я хочу, спасибо. Но если бы это было реализовано, я бы предпочел установить эту опцию глобально, например, при создании фигуры. Это было бы более элегантно.