Python 如何创建两个y轴流式绘图
我按照示例使用DHT22传感器成功地创建了一个流式温度图。该传感器还提供湿度,我想绘图以及 有可能吗?下面的代码是我正在尝试的,但引发了异常:Python 如何创建两个y轴流式绘图,python,plotly,Python,Plotly,我按照示例使用DHT22传感器成功地创建了一个流式温度图。该传感器还提供湿度,我想绘图以及 有可能吗?下面的代码是我正在尝试的,但引发了异常:plotly.exceptions.plotlyaccounter错误:哦,服务器上发生了错误。没有数据被打印到图形中(请参见下文) 更新1: 我修复了代码,不再抛出错误。但仍然没有数据被绘制到图表上。我得到的只是轴: 我认为问题在于两个读数都使用了一个流。您需要单独的流标记和用于温度和湿度的流 下面是一个使用Adafruit Python库实现Raspb
plotly.exceptions.plotlyaccounter错误:哦,服务器上发生了错误。
没有数据被打印到图形中(请参见下文)
更新1:
我修复了代码,不再抛出错误。但仍然没有数据被绘制到图表上。我得到的只是轴:
我认为问题在于两个读数都使用了一个流。您需要单独的流标记和用于温度和湿度的流 下面是一个使用Adafruit Python库实现Raspberry Pi的工作示例。AM2302传感器连接到我的Raspberry Pi上的针脚17:
#!/usr/bin/python
import subprocess
import re
import sys
import time
import datetime
import plotly.plotly as py # plotly library
from plotly.graph_objs import Scatter, Layout, Figure, Data, Stream, YAxis
# Plot.ly credentials and stream tokens
username = 'plotly_username'
api_key = 'plotly_api_key'
stream_token_temperature = 'stream_token_1'
stream_token_humidity = 'stream_token_2'
py.sign_in(username, api_key)
trace_temperature = Scatter(
x=[],
y=[],
stream=Stream(
token=stream_token_temperature
),
yaxis='y'
)
trace_humidity = Scatter(
x=[],
y=[],
stream=Stream(
token=stream_token_humidity
),
yaxis='y2'
)
layout = Layout(
title='Raspberry Pi - Temperature and humidity',
yaxis=YAxis(
title='Celcius'
),
yaxis2=YAxis(
title='%',
side='right',
overlaying="y"
)
)
data = Data([trace_temperature, trace_humidity])
fig = Figure(data=data, layout=layout)
print py.plot(fig, filename='Raspberry Pi - Temperature and humidity')
stream_temperature = py.Stream(stream_token_temperature)
stream_temperature.open()
stream_humidity = py.Stream(stream_token_humidity)
stream_humidity.open()
while(True):
# Run the DHT program to get the humidity and temperature readings!
output = subprocess.check_output(["./Adafruit_DHT", "2302", "17"]);
print output
# search for temperature printout
matches = re.search("Temp =\s+([0-9.]+)", output)
if (not matches):
time.sleep(3)
continue
temp = float(matches.group(1))
# search for humidity printout
matches = re.search("Hum =\s+([0-9.]+)", output)
if (not matches):
time.sleep(3)
continue
humidity = float(matches.group(1))
print "Temperature: %.1f C" % temp
print "Humidity: %.1f %%" % humidity
# Append the data to the streams, including a timestamp
now = datetime.datetime.now()
stream_temperature.write({'x': now, 'y': temp })
stream_humidity.write({'x': now, 'y': humidity })
# Wait 30 seconds before continuing
time.sleep(30)
stream_temperature.close()
stream_humidity.close()
这是图表的外观:
我认为问题在于两个读数都使用了一个流。您需要单独的流标记和用于温度和湿度的流 下面是一个使用Adafruit Python库实现Raspberry Pi的工作示例。AM2302传感器连接到我的Raspberry Pi上的针脚17:
#!/usr/bin/python
import subprocess
import re
import sys
import time
import datetime
import plotly.plotly as py # plotly library
from plotly.graph_objs import Scatter, Layout, Figure, Data, Stream, YAxis
# Plot.ly credentials and stream tokens
username = 'plotly_username'
api_key = 'plotly_api_key'
stream_token_temperature = 'stream_token_1'
stream_token_humidity = 'stream_token_2'
py.sign_in(username, api_key)
trace_temperature = Scatter(
x=[],
y=[],
stream=Stream(
token=stream_token_temperature
),
yaxis='y'
)
trace_humidity = Scatter(
x=[],
y=[],
stream=Stream(
token=stream_token_humidity
),
yaxis='y2'
)
layout = Layout(
title='Raspberry Pi - Temperature and humidity',
yaxis=YAxis(
title='Celcius'
),
yaxis2=YAxis(
title='%',
side='right',
overlaying="y"
)
)
data = Data([trace_temperature, trace_humidity])
fig = Figure(data=data, layout=layout)
print py.plot(fig, filename='Raspberry Pi - Temperature and humidity')
stream_temperature = py.Stream(stream_token_temperature)
stream_temperature.open()
stream_humidity = py.Stream(stream_token_humidity)
stream_humidity.open()
while(True):
# Run the DHT program to get the humidity and temperature readings!
output = subprocess.check_output(["./Adafruit_DHT", "2302", "17"]);
print output
# search for temperature printout
matches = re.search("Temp =\s+([0-9.]+)", output)
if (not matches):
time.sleep(3)
continue
temp = float(matches.group(1))
# search for humidity printout
matches = re.search("Hum =\s+([0-9.]+)", output)
if (not matches):
time.sleep(3)
continue
humidity = float(matches.group(1))
print "Temperature: %.1f C" % temp
print "Humidity: %.1f %%" % humidity
# Append the data to the streams, including a timestamp
now = datetime.datetime.now()
stream_temperature.write({'x': now, 'y': temp })
stream_humidity.write({'x': now, 'y': humidity })
# Wait 30 seconds before continuing
time.sleep(30)
stream_temperature.close()
stream_humidity.close()
这是图表的外观:
在第二个查询中,您当然应该将“y2”作为轴(或者您可能需要将它们组合起来,
{'x':datetime.datetime.now(),'y':s.temperature(),'y2':s.湿度()
@JoranBeasley我已经尝试了这两个选项,都返回了类“Scatter”的无效键“y2”。你真的在循环吗?你运行它时在终端上看到调试打印吗?@JoranBeasley是的,循环正在工作哦,男孩,我相信在on datetime.datetime.now()中存在问题。我会尝试将它改为time.time()当我到家的时候。你肯定应该在第二个查询中将“y2”作为轴(或者你可能需要将它们组合起来{'x':datetime.datetime.now(),'y':s.temperature(),'y2':s.湿度()
@JoranBeasley我已经尝试了这两个选项,都返回了类“Scatter”的无效键“y2”。你真的在循环吗?你运行它时在终端上看到调试打印吗?@JoranBeasley是的,循环正在工作哦,男孩,我相信在on datetime.datetime.now()中存在问题。我会尝试将它改为time.time()当我到家的时候。