【问题标题】:timeseries data plot from sqlite database with gnuplot使用 gnuplot 从 sqlite 数据库中绘制时间序列数据
【发布时间】:2021-02-24 11:25:15
【问题描述】:

我可以使用来自 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,'unixepoch'), ROUND(temperature, 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,'unixepoch'), ROUND(temperature, 2)"

plot for [f in fields] SqliteField(f) using 1:2 with lines

错误信息:x range is invalid

有什么问题?

【问题讨论】:

    标签: bash sqlite plot time-series gnuplot


    【解决方案1】:

    第一点:

    您的代码中似乎对“[f in fields]”的使用存在误解。在代码的“plot for”循环中,循环体执行了 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      • 2017-03-04
      • 2020-04-09
      • 1970-01-01
      相关资源
      最近更新 更多