使用Pandas从熊猫数据框中绘制分组的条形图

时间:2018-11-19 19:04:32

标签: python pandas plotly plotly-dash

对Ploty来说是一个新手,很抱歉,如果这很明显...我正在尝试创建一个分组的条形图,其中包括以下存储在SQL中的信息。

|-----------|------|-------------|
| RouteName | Hour | JourneyTime |
|-----------|------|-------------|
|Route #1   |6:00  |200          |
|Route #2   |6:00  |400          |
|Route #3   |6:00  |500          |
|Route #1   |7:00  |100          |
|Route #2   |7:00  |300          |
|Route #3   |7:00  |550          |
|Route #1   |8:00  |330          |
|Route #2   |8:00  |450          |
|Route #3   |8:00  |600          |

基本上,我希望“小时”列为x,“旅程时间”列为y,以及“路线名称”列来区分路线(不同颜色的条形)。

我设法(使用以下代码)从熊猫数据框中创建图形。但是,每个小时仅显示一个条形,而不显示整个数据集。

import pandas as pd
import pymssql
import plotly
import plotly.graph_objs as go
from plotly.offline import *

ServerNm = str("ServerName")
DatabaseNm = str("DatabaseName")

SQLCon = pymssql.connect(host=ServerNm,database=DatabaseNm)

SQL_Query2 = '''SELECT [RouteName], [Hour], [JourneyTime] FROM [Dashboard].[dbo].[JTs_v2]'''

df2 = pd.read_sql(SQL_Query2, SQLCon)
SQLCon.close

plotly.offline.plot([go.Bar(x=df2.Hour, y=df2.JourneyTime,name='RouteName')])

看链接Adding group bar charts as subplots in plotly,我发现可以给它分别提供一系列数据,分别为trace1和trace2。但是,最终我将把它与Dash Dashboard中的过滤器框链接起来(并且路由的数量会有所不同),所以我需要灵活地随时进行此更改。

我们将不胜感激。

非常感谢

2 个答案:

答案 0 :(得分:0)

您也可以更改动态传递的跟踪数量。也许是这样的:

df = pd.read_sql(query, con)
traces = [go.Bar(x=subset.Hour, 
                 y=subset.JourneyTime,
                 name=route) 
          for route, subset in df.groupby("RouteName")]
plotly.offline.plot(traces)

答案 1 :(得分:0)

可以使用单独的数据帧作为过滤器来创建循环。不是最优雅的解决方案,但它确实有效。

在df1下面的代码中,仅获取路线列表,而df2是我们的完整数据集。由此可以遍历行并生成新的数据帧(df3)。此数据框将创建每个条,并将所有条附加在一起以创建最终图。

import pandas as pd
import pymssql
import plotly
import plotly.graph_objs as go
from plotly.offline import *

ServerNm = str("ServerName")
DatabaseNm = str("DatabaseName")

SQLCon = pymssql.connect(host=ServerNm,database=DatabaseNm)

SQL_Query1 = '''SELECT [RouteName] FROM [Dashboard].[dbo].[JTs_v2] GROUP BY [RouteName]'''
SQL_Query2 = '''SELECT [RouteName], [Hour], [JourneyTime] FROM [Dashboard].[dbo].[JTs_v2]'''

df1 = pd.read_sql(SQL_Query1, SQLCon)
df2 = pd.read_sql(SQL_Query2, SQLCon)

SQLCon.close

bars = []

for index, row in df1.iterrows():

    route=row['RouteName']
    df3 = df2[df2.RouteName == route][['Hour', 'JourneyTime']]
    bars.append(
        go.Bar(
                x=df3.Hour,
                y=df3.JourneyTime,
                name=route))


fig = go.Figure(data=bars)
plotly.offline.plot(fig)