Построение сгруппированной гистограммы с помощью Plotly из кадра данных pandas - PullRequest
0 голосов
/ 19 ноября 2018

Очень плохо знаком с 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          |

По существу, яхочу, чтобы столбец Hour был x, столбец JourneyTime - y, а столбец RouteName - чтобы различать маршруты (разные цвета для разных баров).

Мне удалось получить график (используя следующий код) для созданияграфик из кадра данных панд.Однако он показывает только одну гистограмму для каждого часа, а не весь набор данных.

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')])

Просмотр ссылки Добавление групповых гистограмм в качестве вспомогательных участков на графике Я видел, что вы можете датьэто отдельные серии данных как trace1 и trace2.Однако в конечном итоге я буду связывать это с блоками фильтров в Dash Dashboard (и количество маршрутов будет различаться), поэтому мне потребуется гибкость, чтобы эти изменения происходили на лету.

Любая помощь, которая может быть предложена, будетс благодарностью.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Можно создать цикл, используя отдельный фрейм данных в качестве фильтра. Не самое элегантное решение, но оно работает.

В приведенном ниже коде 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)
0 голосов
/ 19 ноября 2018

Вы также можете изменить количество трасс, которые вы проходите на лету. Может быть, что-то вроде этого:

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)
...