Несколько осей Y с одинаковыми осями X в Matplotlib - PullRequest
0 голосов
/ 10 марта 2020

Здравствуйте, у меня есть несколько значений для построения графика, которые имеют одинаковую ось x (время), но несколько значений y (температура, влажность и т. Д. c). Я сделал этот код. Я не могу получить шкалу оси Y справа и в хорошей форме (теперь есть перекрывающиеся шкалы y, поэтому вы не можете видеть, какие значения у вас есть для каждого значения). Мне нужен график, который имеет ту же ось, но столбцы y находятся справа, и вы можете понять его значения, поэтому проблемы - это столбцы y, которые не очень хорошо показаны. Как я могу это исправить? Это проблема https://i.imgur.com/G1EiYIh.png, поскольку вы можете видеть, что столбец y не в хорошем состоянии, он тоже перекрывается

import serial
import time
import matplotlib.pyplot as plt
import numpy as np
from drawnow import *
arduinoData = serial.Serial('/dev/ttyACM0',9600)
time.sleep(2)
data_temperature = []                       # empty list to store the data
data_luminosity = []
data_thermistor = []
data_umidity = []
plt.ion()
counter = 0
def makePlot():

    plt.ylim(15,35)
    plt.title('Real Time Data')
    plt.grid(True)
    plt.ylabel('Temperature')
    plt.plot(data_temperature, 'ro-', label = 'Temperature')
    plt.tick_params(direction='right')
    plt.legend(loc='upper left')
    plt2 = plt.twinx()

    plt2.plot(data_umidity, 'bo-', label = 'Umidity %')
    plt2.legend(loc= 'upper right')
    plt3 = plt.twinx()
    plt3.plot(data_thermistor, 'go-', label = 'Thermistor temperature')
    plt3.legend(loc = 'lower left')


while True:
    if arduinoData.inWaiting()==0:
        pass
    time.sleep(5)
    arduinoString = arduinoData.readline()         # read a byte string
    arrayData = arduinoString.split()
    luminosity = float(arrayData[0])
    thermistorTemperature = float(arrayData[1])
    temperature = float(arrayData[2])
    umidity = float(arrayData[3])
    print(luminosity, thermistorTemperature, temperature, umidity)
    data_temperature.append(temperature)
    data_luminosity.append(luminosity)
    data_thermistor.append(thermistorTemperature)
    data_umidity.append(umidity)
    drawnow(makePlot)
    plt.pause(.000001)
    counter += 1
    if counter > 50:
        data_temperature.pop(0)
        data_umidity.pop(0)


ser.close()

1 Ответ

0 голосов
/ 10 марта 2020

Если вы последуете примеру matplotlib для нескольких осей y с изменением шипов, ваш ответ лежит там. Вам нужно отодвинуть его дальше от исходного графика и установить видимость его шипов.

plt3 = plt.twinx()
# Offset the right spine of plt3.  The ticks and label have already been
# placed on the right by twinx above.
plt3.spines["right"].set_position(("axes", 1.2))
# Having been created by twinx, plt3 has its frame off, so the line of its
# detached spine is invisible.  First, activate the frame but make the patch
# and spines invisible.
make_patch_spines_invisible(plt3)
# Second, show the right spine.
plt3.spines["right"].set_visible(True)

РЕДАКТИРОВАТЬ: И ниже приведена функция make_patch_spines_invisible, взятая из примера в ссылка выше.

def make_patch_spines_invisible(ax):
    ax.set_frame_on(True)
    ax.patch.set_visible(False)
    for sp in ax.spines.values():
        sp.set_visible(False)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...