簡體   English   中英

Plotly:如何給多類條形圖添加trace?

[英]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.

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