为 python 绘图,仅绘制第一个数据点

Plotly for python, only first data point is being graphed

我不熟悉 plotly 和使用脚本来根据从数据库中提取的一些结果生成图表。然而,当我将数据发送到 plotly 时,只绘制了三个轨迹中每一个的第一个数据点。我已经验证列表包含正确的数据,我什至只是将列表粘贴进去而不是动态创建变量。不幸的是,每次只绘制第一个数据点。有谁知道我在这里缺少什么?如果需要,我也愿意向另一个图书馆开放。

是否也可以将 x 轴显示为字符串?

import plotly.plotly as py
import plotly.graph_objs as go
# Custom database class, works fine.
from classes.database import DatabaseConnection

# Database Connections and instances
db_instance = DatabaseConnection()
db_conn = db_instance.conn
db_cur = db_instance.cur



def main():


    # Get a list of versions and their stats.
    db_cur.execute(
        """
        select row_to_json(x) from
        (SELECT
               versions.version_number,
               cast(AVG(results.average) as double precision) as average,
               cast(AVG(results.minimum) as double precision) as minimum,
               cast(AVG(results.maximum) as double precision) as maximum
                  FROM versions,results
                    WHERE
                      versions.version_number = results.version_number
                      GROUP BY
                        versions.version_number) x;
                """
    )

    versions = []
    average = []
    minimum = []
    maximum = []

    unclean = db_cur.fetchall()

    # Create lists for x and y coordinates.
    for row in unclean:
        versions.append(row[0]['version_number'])
        average.append(int(row[0]['average']))
        minimum.append(int(row[0]['minimum']))
        maximum.append(int(row[0]['maximum']))

    grph_average = go.Scatter(
        x=versions,
        y=average,
        name = 'Average',
        mode='lines',
    )

    grph_minimum = go.Scatter(
        x=versions,
        y=minimum,
        name = 'Minimum',
        mode='lines',
    )

    grph_maximum = go.Scatter(
        x=versions,
        y=maximum,
        name = 'Maximum',
        mode='lines',
    )


    data = go.Data([grph_average, grph_minimum, grph_maximum])
    # Edit the layout
    layout = dict(title = 'Responses',
              xaxis = dict(title = 'Versions'),
              yaxis = dict(title = 'Ms'),
              )

    fig = dict(data=data, layout=layout)
    py.plot(fig, filename='response-times', auto_open=False)


if __name__ == '__main__':
    main()

查询returns的数据如下,如果要插入值:

versions = ['6.1', '5.0', '5.2'] 
average = [11232, 29391, 10429] 
minimum = [3641, 7729, 3483] 
maximum = [57440, 62535, 45201]

这里有一些 matplotlib 可以帮助您开始这方面的工作:

import matplotlib.pyplot as plt

versions = ['6.1', '5.0', '5.2'] 
average = [11232, 29391, 10429] 
minimum = [3641, 7729, 3483] 
maximum = [57440, 62535, 45201]

plt.plot(minimum)
plt.plot(average)
plt.plot(maximum)
plt.xticks(range(len(versions)), versions)

看来是我的 x 轴有问题。通过在版本号之前添加一些文本并将特定类型转换为字符串,我能够正确生成图表。

# Create lists for x and y coordinates.
for row in unclean:
    versions.append("Version: " + str(row[0]['version_number']))
    average.append(int(row[0]['average']))
    minimum.append(int(row[0]['minimum']))
    maximum.append(int(row[0]['maximum']))