簡體   English   中英

Plotly:如何在來自同一 Pandas 數據幀的不同列的一個繪圖圖表中繪制多條線?

[英]Plotly: How to plot multiple lines in one plotly chart from different columns from the same pandas dataframe?

我有下表作為熊貓:

>>>date          hour      plant1   plant2  plant3  plant4    ...
0 2019-06-23    07:00:00   251.2     232.7   145.1   176.7
1 2019-06-23    07:02:00   123.4     173.1   121.5   180.4
2 2019-06-23    07:04:00   240.1     162.7   140.1   199.5
3 2019-06-23    07:06:00   224.8     196.5   134.1   200.5
4 2019-06-23    07:08:00   124.3     185.4   132.3   190.1
...

我想以交互方式繪制每個植物(每列)以創建帶有所有植物列的線圖。

只繪制一條線對我有用:

import plotly.express as px

fig = px.line(df, x=df.iloc[:,2], y=df.iloc[:,3])
fig.show()

但是當我嘗試使用 iloc 繪制所有列並像這樣放置所有列時,它失敗了:

fig = px.line(df, x=df.iloc[:,2], y=df.iloc[:,3:])

ValueError:所有參數都應該具有相同的長度。 列參數df[wide_variable_0]的長度為 2814,而先前處理的參數 ['x'] 的長度為 201

我知道因為 plotly 不理解我輸入的 iloc 來單獨繪制每一列。

我如何告訴它將每列繪制為單獨的線(例如,類似這樣的東西,但使用我的數據和每列的線,因此我們將使用列名而不是國家/地區): 在此處輸入圖片說明

*這個例子來自 plotly 手冊 ( https://plotly.com/python/line-charts/ )

我的最終目標:將每一列繪制為每個植物列的線

編輯:我也試過用這里描述的熊貓來做到這一點,但由於某種原因,當我像這樣嘗試時,我得到了錯誤:

dfs['2019-06-23'].iloc[:,2:].plot(kind='line')
 >>>ImportError: matplotlib is required for plotting when the default backend "matplotlib" is selected.

但是當我“更改訂單”時:

plt.plot(df.iloc[:,2:])

它有效但不是交互式的。

您可以使用to_plot = [v for v in list(df.columns) if v.startswith('plant')]簡單地定義要在list(df.columns)繪制的列名稱,然后使用fig = px.line(df, x=df.index, y=to_plot)得到:

在此處輸入圖片說明

完整代碼:

import pandas as pd
import plotly.express as px

df = pd.DataFrame({'date': {0: '2019-06-23',
                              1: '2019-06-23',
                              2: '2019-06-23',
                              3: '2019-06-23',
                              4: '2019-06-23'},
                             'hour': {0: '07:00:00',
                              1: '07:02:00',
                              2: '07:04:00',
                              3: '07:06:00',
                              4: '07:08:00'},
                             'plant1': {0: 251.2, 1: 123.4, 2: 240.1, 3: 224.8, 4: 124.3},
                             'plant2': {0: 232.7, 1: 173.1, 2: 162.7, 3: 196.5, 4: 185.4},
                             'plant3': {0: 145.1, 1: 121.5, 2: 140.1, 3: 134.1, 4: 132.3},
                             'plant4': {0: 176.7, 1: 180.4, 2: 199.5, 3: 200.5, 4: 190.1}})

df['ix'] = df['date']+' ' +df['hour']
df['ix'] = pd.to_datetime(df['ix'])

to_plot = [v for v in list(df.columns) if v.startswith('plant')]

fig = px.line(df, x=df.index, y=to_plot)
fig.show()

你能提供一部分數據嗎? 我不知道你究竟用什么作為 x。 df.iloc[:,2]看起來像植物 1

一般來說,新版本的 plotly 可能需要多個 y,舊版本可能不需要; 如果更新包仍然不起作用,請像這樣合並數據框:

list =  # all the lines you want to draw, eg ['plant1','plant2']

df = pd.melt(df,
            id_vars=["date", "hour"],
            value_vars= list ,
            var_name="plant_number",
            value_name="y")

fig = px.line(df, x= "date", y="y" ,color = "plant_number")
fig.show()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM