Как разделить оси x в цикле?

#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. Он делает то, что я хочу, спасибо. Но если бы это было реализовано, я бы предпочел установить эту опцию глобально, например, при создании фигуры. Это было бы более элегантно.