[英]Plotly: How to add trace to multicategory bar chart?
我嘗試向多類別條形圖添加一條線,但未顯示。 這是一個錯誤還是我錯過了什么?
Offtopic:我可以格式化 xaxis 類別(刻度,而不是類別值)嗎?,因為 tickformat 自動引用子類別。
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame({
"tick": [0, 0, 1, 1, 1, 2, 2, 2],
"value": [12, -6, 9, -14, -10, 9, -10, 5],
"category": ['Born', 'Died', 'Born', 'Died', 'Died', 'Born', 'Died', 'Born'],
"type": ["Penguin", "Lion", "Penguin", "Lion", "Apes", "Penguin", "Lion", "Apes"]
})
fig = go.Figure()
for t in df.type.unique():
plot_df = df[df.type == t]
fig.add_trace(go.Bar(
x=[plot_df.tick, plot_df.category],
y=abs(plot_df.value),
name=t,
))
total_df = df.groupby(['tick']).sum()
fig.add_trace(
go.Scatter(
x=df.tick.unique(),
y=total_df.value,
name="Born - Died",
mode='lines+markers',
)
)
fig.update_layout({
'barmode': 'stack',
'xaxis': {
'title_text': "Tick",
'dtick': 'M1',
'tickformat': "%m.%Y",
'tickangle': -90,
},
'yaxis': {
'title_text': "Value",
},
})
fig.write_html(str("./out2.html"))
這是您的設置中的錯誤或規格錯誤。 很明顯,你的fig.add_traces(go.Scatter))
做了一些事情,因為它看起來像這樣:
沒有它看起來像這樣(注意 y 軸范圍和圖例):
問題似乎是多類別 x 軸。 對於您的每條痕跡,您都有以下 x 值:
([0, 1, 2], ['Born', 'Born', 'Born'])
([0, 1, 2], ['Died', 'Died', 'Died'])
([1, 2], ['Died', 'Born'])
[0 1 2]
因此,當您嘗試fig.add_traces(go.Scatter(x=df.tick.unique()))
其中df.tick.unique()
是array([0, 1, 2], dtype=int64)
時,似乎 plotly 對確切顯示的內容感到困惑。 因此,您可以做的是檢索所有這些不同的 x 值並嘗試使用最適合您需求的一個:
xadj = [[*d['x']] for d in fig.data]
接着:
fig.add_trace(
go.Scatter(
#x=df.tick.unique().tolist(),
#x=total_df.index,
x=xadj[1],
y=total_df.value.tolist(),
name="Born - Died",
mode='lines+markers',
),secondary_y=True
)
這將產生這個 plot:
我相信這個數字講述了您想分享的故事。 但是,如果我理解正確的話,您寧願顯示以[0, 1, 2]
為中心的紫色線,而不是類別 ['Born', 'Died'] 上方。 如果您能夠切換 x 軸類別的顯示順序,這可能正是您所需要的。 仔細看看下面的完整代碼示例,我們可以在您找到時間時詳細討論。
import pandas as pd
import plotly.graph_objects as go
df = pd.DataFrame({
"tick": [0, 0, 1, 1, 1, 2, 2, 2],
"value": [12, -6, 9, -14, -10, 9, -10, 5],
"category": ['Born', 'Died', 'Born', 'Died', 'Died', 'Born', 'Died', 'Born'],
"type": ["Penguin", "Lion", "Penguin", "Lion", "Apes", "Penguin", "Lion", "Apes"]
})
from plotly.subplots import make_subplots
# set figure twith multiple y axes
fig = make_subplots(specs=[[{"secondary_y": True}]])
for t in df.type.unique():
plot_df = df[df.type == t]
fig.add_trace(go.Bar(
x=[plot_df.tick, plot_df.category],
#x=[plot_df.category, plot_df.tick],
y=abs(plot_df.value),
name=t,
))
total_df = df.groupby(['tick']).sum()
# xadj =[]
# for d in fig.data:
# xadj.append([*d['x']])
xadj = [[*d['x']] for d in fig.data]
fig.add_trace(
go.Scatter(
#x=df.tick.unique().tolist(),
#x=total_df.index,
x=xadj[1],
y=total_df.value.tolist(),
name="Born - Died",
mode='lines+markers',
),secondary_y=True
)
fig.update_layout({
'barmode': 'stack',
'xaxis': {
'title_text': "Tick",
'dtick': 'M1',
'tickformat': "%m.%Y",
'tickangle': -90,
},
'yaxis': {
'title_text': "Value",
},
})
#fig.write_html(str("./out2.html"))
fig.show()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.