如何解决使用gnuplot从sqlite数据库中获取时间序列数据图 第一点:第二点:摘要
我可以使用sqlite数据库中的gnuplot直接绘制时间序列数据集吗?
我有一个sqlite数据库,我想绘制时间序列数据。我创建了查询。真的很简单,它正在工作。这是sqlite3查询,并发送到文件:
$ sqlite3 ./home_temp.db "SELECT datetime(datetime_int,'unixepoch'),ROUND(temperature,2) FROM bme280_data ORDER BY datetime_int DESC LIMIT 288;" >> home_temp.dat
这是home_temp.dat文件中的以下几行:
2020-10-12 13:20:01|21.02
2020-10-12 13:15:02|20.95
2020-10-12 13:10:01|20.89
2020-10-12 13:05:01|20.8
2020-10-12 13:00:01|20.74
2020-10-12 12:55:02|20.87
我可以用gnuplot读取并绘制它。没关系。
#! /usr/bin/env gnuplot
set terminal dumb 150 25
set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%H:%M"
set xtics rotate by -90
set datafile separator "|"
plot "<(sqlite3 ./home_temp.db 'SELECT datetime(datetime_int,2) FROM bme280_data ORDER BY datetime_int DESC LIMIT 288;')" using 1:2 with lines
plot './home_temp.dat' using 1:2 with lines
pause -1
现在,当我更改此gnuplot文件时,要从sqlitedb中读取,而不是从文件中读取。它不再工作了。有人知道为什么吗?
#! /usr/bin/env gnuplot
set terminal dumb 150 25
set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%H:%M"
set xtics rotate by -90
set datafile separator "|"
SqliteField(f) = '< sqlite3 ./home_temp.db "SELECT '.f.' FROM bme280_data ORDER BY datetime_int DESC LIMIT 288;"'
fields = "datetime(datetime_int,2)"
plot for [f in fields] SqliteField(f) using 1:2 with lines
错误消息:x range is invalid
出什么问题了?
解决方法
第一点:
您的代码中似乎对“ [f in fields]”的使用有误解。在代码的“情节”循环中,循环主体执行了3次,并将以下值顺序分配给“ f”。
datetime(datetime_int,'unixepoch’)
ROUND(temperature
2)
这是因为存储在字段中的字符串被空格字符分割并依次传递给f。
如果您不使用循环,而只是求值“ SqliteField(fields)”,我想您会得到想要的结果。
第二点:
在SqliteField(f)的定义中,不需要结尾的双引号。您只需将其打印到STDOUT即可检查SqliteField(fields)的结果字符串,
print SqliteField(fields)
摘要
如果您的代码进行了如下修改,它将可以正常工作。
#! /usr/bin/env gnuplot
set terminal dumb 150 25
set xdata time
set timefmt "%Y-%m-%d %H:%M:%S"
set format x "%H:%M"
set xtics rotate by -90
set datafile separator "|"
SqliteField(f) = '< sqlite3 ./home_temp.db "SELECT '.f.' FROM bme280_data ORDER BY datetime_int DESC LIMIT 288;'
fields = "datetime(datetime_int,'unixepoch'),ROUND(temperature,2)"
plot SqliteField(fields) using 1:2 with lines
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。