несколько графиков в одной фигуре в Python

Я новичок в python и пытаюсь построить несколько строк на одном рисунке, используя matplotlib. Значение моей оси Y хранится в словаре, и я делаю соответствующие значения в оси X в моем следующем коде

мой код выглядит так:

for i in range(len(ID)):
AxisY= PlotPoints[ID[i]]
if len(AxisY)> 5:
    AxisX= [len(AxisY)]
    for i in range(1,len(AxisY)):
        AxisX.append(AxisX[i-1]-1)
    plt.plot(AxisX,AxisY)
    plt.xlabel('Lead Time (in days)')
    plt.ylabel('Proportation of Events Scheduled')
    ax = plt.gca()
    ax.invert_xaxis()
    ax.yaxis.tick_right()
    ax.yaxis.set_label_position("right")
    plt.show()

но я получаю отдельные фигуры с одним сюжетом один за другим. Кто-нибудь может помочь мне понять, что не так с моим кодом? Почему я не могу создать несколько линий? Большое спасибо!

4 ответов


это очень просто сделать:

import matplotlib.pyplot as plt

plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.legend(loc='best')
plt.show()

вы можете продолжать добавлять plt.plot столько раз, сколько вам нравится. Что касается line type, вам нужно сначала указать цвет. Так что для blue это b. И для нормальной линии это -. Примером может служить:

plt.plot(total_lengths, sort_times_heap, 'b-', label="Heap")

поскольку у меня нет достаточно высокой репутации, чтобы комментировать, я отвечу на вопрос Ляна 20 февраля в 10:01 как ответ на первоначальный вопрос.

для того, чтобы показать метки строк, вам нужно добавить plt.легенда к вашему коду. чтобы построить на предыдущем примере выше, который также включает заголовок, ylabel и xlabel:

import matplotlib.pyplot as plt

plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.plot(<X AXIS VALUES HERE>, <Y AXIS VALUES HERE>, 'line type', label='label here')
plt.title('title')
plt.ylabel('ylabel')
plt.xlabel('xlabel')
plt.legend()
plt.show()

редактировать: Я только что понял, прочитав ваш вопрос снова, что я не ответил на ваш вопрос. Вы хотите ввести несколько строк на одном участке. Однако я оставлю это, потому что это служило мне очень хорошо несколько раз. Я надеюсь, что вы найдете полезным, когда-нибудь

Я нашел это некоторое время назад при изучении python

import matplotlib as plt
import matplotlib.gridspec as gridspec

fig = plt.figure() 
# create figure window

gs = gridspec.GridSpec(a, b)
# Creates grid 'gs' of a rows and b columns 


ax = plt.subplot(gs[x, y])
# Adds subplot 'ax' in grid 'gs' at position [x,y]


ax.set_ylabel('Foo') #Add y-axis label 'Foo' to graph 'ax' (xlabel for x-axis)


fig.add_subplot(ax) #add 'ax' to figure

вы также можете сделать разные размеры на одной фигуре, используйте ломтики в этом случае:

 gs = gridspec.GridSpec(3, 3)
 ax1 = plt.subplot(gs[0,:]) # row 0 (top) spans all(3) columns

обратитесь к docs для получения дополнительной помощи и примеров. Этот маленький бит я набрал для себя один раз и очень основан/скопирован из документов. Надеюсь, это поможет... Я помню, что это боль в#$%, чтобы познакомиться с нотацией среза для разных размеров участков на одном рисунке. После этого я думаю, что это очень просто :)


OP утверждает, что каждый элемент участка перезаписывает предыдущий, а не объединяется в один участок. Это может произойти даже с одним из многих предложений, сделанных другими ответами. Если вы выберете несколько строк и запустите их вместе, скажите:

plt.plot(<X>, <Y>)
plt.plot(<X>, <Z>)

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

этот возможно, это то, что случилось с операцией. Это просто случилось со мной: я установил новую привязку ключа для выполнения кода одним нажатием клавиши (on spyder), но моя привязка ключа выполняла только текущую строку. Решение состояло в том, чтобы выбрать строки целыми блоками или запустить весь файл.