Я не могу получить несколько живых графиков, работающих одновременно в Matplotlib - Python - PullRequest
0 голосов
/ 01 июля 2018
jsontime = [-9,-8,-7,-6,-5,-4,-3,-2,-1,0]
f, axarr = plt.subplots(1, 1)
ax1 = axarr[0, 0]
ax2 = axarr[0, 1]

def tempa_plot():
    jsontempa = []
    ay=[]
    for k in range(100):
        jsontempaval = random.randint(30, 80)
        jsontempa.append(jsontempaval)
        print(len(jsontempa))

    for i in jsontempa:
        ay.append(i)
        if len(ay) > 10:
            ay.pop(0)
            ax1.ylim(30, 80)  # Set y min and max values
            ax1.xlim(-9, 1)
            ax1.title('Live Streaming Sensor Data: Temperature')
            ax1.grid(True)
            ax1.ylabel('Temp C')  # Set ylabels
            ax1.xlabel('Time')
            ax1.plot(jsontime,ay,label='Degrees C')
            ax1.legend(loc='upper left')  # plot the legend
            ax1.pause(0.2)
            ax1.clf()
            ax1.set_title('Axis [0,0]')

def tempb_plot():
    jsontempb = []
    by=[]
    for k in range(100):
        jsontempaval = random.randint(50, 100)
        jsontempb.append(jsontempaval)
        print(len(jsontempb))

    for i in jsontempb:
        by.append(i)

        if len(by) > 10:
            by.pop(0)
            print(by)
            ax2.ylim(45, 105)  # Set y min and max values
            ax2.xlim(-9, 1)
            ax2.title('Live Streaming Sensor Data: Temperature b')
            ax2.grid(True)
            ax2.ylabel('Temp C')  # Set ylabels
            ax2.xlabel('Time')

            ax2.plot(jsontime,by,label='Degrees C')
            ax2.legend(loc='upper left')  # plot the legend
            ax2.pause(0.2)
            ax2.clf()
            axarr[0, 1].set_title('Axis [0,0]')


tempa_plot()
tempb_plot()

Это приводит к ошибке осей, не поддерживающих индексирование. У меня есть постоянный поток данных из моего Arduino. Должен ли я попробовать многопоточность? Есть ли более простой и эффективный способ сделать это? Я попытался запустить из разных программ, и это прекрасно работает. ТИА

1 Ответ

0 голосов
/ 01 июля 2018

plt.subplots(1, 1) создает 1: 1 сетку подзаговоров, т. Е. Имеется только один участок. Таким образом, возвращаемый объект - это сами оси, а не массив. Я подозреваю, что вы ищете либо plt.subplots(1, 2), либо plt.subplots(2, 1), в зависимости от того, как вы хотите, чтобы оси были ориентированы.

Кроме того, как только вы исправите это, вы обнаружите, что в вашем коде есть другие ошибки. Вы, кажется, смешиваете некоторые имена функций из matplotlib.pyplot (plt) с методами на объектах осей. Например, чтобы установить предел y, вы можете использовать plt.ylim(...) или axes.set_ylim(...), но не axes.ylim(...). Я думаю, у вас возникнет эта проблема при попытке установить ylim, xlim, title, xlabel и ylabel, и все это можно исправить, просто добавив set_... в начале каждого собственности, если я правильно помню.

Edit: Кроме того, я только что заметил, что вы устанавливаете заголовок на каждой оси дважды, первый раз неправильно и второй раз правильно; Вы, вероятно, хотите только один раз. Также не уверен, что происходит с вызовами clf и pause (оба из которых, кстати, должны быть plt, а не объектом оси). Вы должны просто сделать plt.show() после вызова обеих ваших функций.

...