相同的資助日期與學科資料集使用 plotly.express (px) 線和 plotly.graph_objects (go) 散點軌跡以不同方式繪制。繪圖的形狀看起來相同,但 go 跟蹤中的日期錯誤。關于這里可能有什么問題的任何建議?謝謝你。
使用 px.line:
fig = px.line(df_fig, x='date_list', y='monthly_avg', color='main_discipline')

使用 go.Figure
plot = go.Figure()
plot.add_trace(go.Scatter(
name = 'Data 1',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==1].monthly_avg,
stackgroup='one'
))
plot.add_trace(go.Scatter(
name = 'Data 2',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==2].monthly_avg,
stackgroup='one'
))
plot.add_trace(go.Scatter(
name = 'Data 3',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==3].monthly_avg,
stackgroup='one'
))
plot.add_trace(go.Scatter(
name = 'Data 5',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==5].monthly_avg,
stackgroup='one'
))

date_list 的型別為 datetime64:
df_fig.date_list
0 1975-06-01
1 1975-06-01
2 1975-06-01
3 1975-06-01
4 1975-07-01
...
2455 2026-07-01
2456 2026-08-01
2457 2026-08-01
2458 2026-08-01
2459 2026-08-01
Name: date_list, Length: 2460, dtype: datetime64[ns]
洗掉堆疊組生成了相同形狀的圖,但錯誤的結束日期仍然是 1988 年 3 月而不是 2026 年 7 月。

這是帶有前 20 行的資料框,日期是使用持久化
df_fig[['date_list', 'main_discipline', 'monthly_avg']]
date_list main_discipline monthly_avg
0 1975-06-01 1 0.000000
1 1975-06-01 2 15494.000000
2 1975-06-01 3 0.000000
3 1975-06-01 5 0.000000
4 1975-07-01 1 0.000000
5 1975-07-01 2 16827.333333
6 1975-07-01 3 0.000000
7 1975-07-01 5 0.000000
8 1975-08-01 1 3880.252381
9 1975-08-01 2 16827.333333
10 1975-08-01 3 0.000000
11 1975-08-01 5 0.000000
12 1975-09-01 1 3880.252381
13 1975-09-01 2 16827.333333
14 1975-09-01 3 0.000000
15 1975-09-01 5 0.000000
16 1975-10-01 1 201134.985609
17 1975-10-01 2 986805.179029
18 1975-10-01 3 590159.728836
19 1975-10-01 5 0.000000
使用 px.line
fig = px.line(df_fig[df_fig.main_discipline==1], x='date_list', y='monthly_avg')
fig.show()

使用 go.Scatter
plot = go.Figure()
plot.add_trace(go.Scatter(
name = 'Data 1',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==1].monthly_avg,
))
plot.show()

uj5u.com熱心網友回復:
發生這種情況是因為您無意中將不同的資料傳遞給go.Scatter和px.line。在下面的代碼片段中,您傳遞的x=df_fig.date_list是所有 date_list 值,但僅傳遞了一些monthly_avg(由 main_discipline==1 組成的子集)。
plot = go.Figure()
plot.add_trace(go.Scatter(
name = 'Data 1',
x = df_fig.date_list,
y = df_fig[df_fig.main_discipline==1].monthly_avg,
))
plot.show()
ValueError: all arguments should have the same length在這種情況下,Plotly 可能應該拋出例外,而是嘗試通過縮短傳遞給 x 的陣列以匹配傳遞給 y 的陣列來繪制它。df_fig[df_fig.main_discipline==1].monthly_avg長度為 5,前 5 個值df_fig.date_list如下:
>>> df_fig.date_list
0 1975-06-01
1 1975-06-01
2 1975-06-01
3 1975-06-01
4 1975-07-01
這解釋了你得到的情節,但這絕對不是你想要的,而是應該給你正確的結果:
plot = go.Figure()
plot.add_trace(go.Scatter(
name = 'Data 1',
x = df_fig[df_fig.main_discipline==1].date_list,
y = df_fig[df_fig.main_discipline==1].monthly_avg,
))
plot.show()

uj5u.com熱心網友回復:
- 您剛剛共享了一個日期串列,創建了一個包含所有必需列的資料框
- 重構go 的使用以減少重復
- 從根本上說,您是通過設定請求不同的格式
stackgroup - px將對非常大的圖使用scattergl,這不支持
stackgroup. 因此,更新跟蹤無法使px圖類似于大日期范圍的go圖
import numpy as np
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd
ed = "1-aug-2026"
ed = "1-aug-1976"
df_fig = pd.DataFrame({"date_list": pd.date_range("1-jun-1975", ed)}).assign(
main_discipline=lambda d: ((d.index % 5) 1).astype(str),
monthly_avg=lambda d: np.geomspace(1, 5 * 10 ** 7, len(d)) * d["main_discipline"].astype(int),
)
fig = px.line(df_fig, x='date_list', y='monthly_avg', color='main_discipline')
fig.show()
try:
fig.for_each_trace(lambda t: t.update(stackgroup="one"))
except ValueError:
print(f"{fig.data[0].type} doesn't support stackgroup")
fig.show()
plot = go.Figure()
for k, d in df_fig.groupby("main_discipline"):
plot.add_trace(go.Scatter(name="Data " k, x=d["date_list"], y=d["monthly_avg"], stackgroup="one"))
plot.show()
plot.update_traces(stackgroup=None).show()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/391736.html
