簡體   English   中英

Plotly:如何使用 python 創建子圖?

[英]Plotly:How to create subplots with python?

我想知道使用 Python Plotly 創建子圖的最佳實踐是什么。 是使用plotly.express還是standard plotly.graph_objects

我正在嘗試創建一個帶有兩個子圖的圖形,它們是堆積條形圖。 以下代碼不起作用。 我在官方文檔中沒有找到任何有用的東西。 經典泰坦尼克號數據集在此處作為train_df導入。

import plotly.express as px

train_df['Survived'] = train_df['Survived'].astype('category')
fig1 = px.bar(train_df, x="Pclass", y="Age", color='Survived')
fig2 = px.bar(train_df, x="Sex", y="Age", color='Survived')

trace1 = fig1['data'][0]
trace2 = fig2['data'][0]

fig = make_subplots(rows=1, cols=2, shared_xaxes=False)
fig.add_trace(trace1, row=1, col=1)
fig.add_trace(trace2, row=1, col=2)

fig.show()

我得到了下圖:

在此處輸入圖片說明

我的期望如下:

在此處輸入圖片說明

據我所知,不可能對 stakedbar 進行子繪圖(因為堆疊的條形圖實際上是數字而不是痕跡)...

代表 fig.show(),您可以檢查 html 文件是否適合您(不幸的是,這些圖在另一個下方......):

with open('p_graph.html', 'a') as f:
    f.write(fig1.to_html(full_html=False, include_plotlyjs='cdn',default_height=500))
    f.write(fig2.to_html(full_html=False, include_plotlyjs='cdn',default_height=500))

試試下面的代碼來檢查生成的 html 文件是否適合你:

import pandas as pd
import plotly.graph_objects as go

#Remove the .astype('category') to easily 
#train_df['Survived'] = train_df['Survived'].astype('category')
Pclass_pivot=pd.pivot_table(train_df,values='Age',index='Pclass',
                   columns='Survived',aggfunc=lambda x: len(x))
Sex_pivot=pd.pivot_table(train_df,values='Age',index='Sex',
                   columns='Survived',aggfunc=lambda x: len(x))

fig1 = go.Figure(data=[
    go.Bar(name='Survived', x=Pclass_pivot.index.values, y=Pclass_pivot[1]),
    go.Bar(name='NotSurvived', x=Pclass_pivot.index.values, y=Pclass_pivot[0])])

# Change the bar mode
fig1.update_layout(barmode='stack')


fig2 = go.Figure(data=[
    go.Bar(name='Survived', x=Sex_pivot.index.values, y=Sex_pivot[1]),
    go.Bar(name='NotSurvived', x=Sex_pivot.index.values, y=Sex_pivot[0])])
# Change the bar mode
fig2.update_layout(barmode='stack')

with open('p_graph.html', 'a') as f:
    f.write(fig1.to_html(full_html=False, include_plotlyjs='cdn',default_height=500))
    f.write(fig2.to_html(full_html=False, include_plotlyjs='cdn',default_height=500))

我希望現有的答案適合您的需求,但我只想指出該聲明

不可能對 stakedbar 進行子圖(因為堆疊的條形圖實際上是數字而不是痕跡

不完全正確。 只要您使用add_trace()go.Bar()將其正確組合在一起,就可以使用堆積條形圖構建一個可繪制的子圖。 這也回答了您關於以下方面的問題:

我想知道使用 Python Plotly 創建子圖的最佳實踐是什么。 是使用 plotly.express 還是標准的 plotly.graph_objects?

使用plotly.express ff 您會找到適合您需求的px方法。 而像你的情況,你do not找它; 使用plotly.graphobjects構建您自己的子圖。

下面是一個示例,它將向您展示使用titanic數據集的一種可能的方法。 請注意,列名與您的不同,因為沒有大寫字母。 這approav的本質是,你使用go.Bar()每道,並指定把使用這些痕跡rowcol論點go.Bar() 如果您將多個跟蹤分配給同一rowcol ,如果您在fig.update_layout(). Using指定barmode='stack' ,您將獲得堆積的條形圖子圖fig.update_layout(). Using fig.update_layout(). Using px.colors.qualitative.Plotly[i]` 可以讓您從標准繪圖顏色循環中按順序分配顏色。

陰謀:

在此處輸入圖片說明

代碼:

from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.express as px
import pandas as pd

url = "https://raw.github.com/mattdelhey/kaggle-titanic/master/Data/train.csv"
titanic = pd.read_csv(url)
#titanic.info()
train_df=titanic
train_df

# data for fig 1
df1=titanic.groupby(['sex', 'pclass'])['survived'].aggregate('mean').unstack()

# plotly setup for fig
fig = make_subplots(2,1)
fig.add_trace(go.Bar(x=df1.columns.astype('category'), y=df1.loc['female'],
                     name='female',
                     marker_color = px.colors.qualitative.Plotly[0]),
    row=1, col=1)


fig.add_trace(go.Bar(x=df1.columns.astype('category'), y=df1.loc['male'],
                     name='male',
                     marker_color = px.colors.qualitative.Plotly[1]),
    row=1, col=1)


# data for plot 2
age = pd.cut(titanic['age'], [0, 18, 80])
df2 = titanic.pivot_table('survived', [age], 'pclass')
groups=['(0, 18]', '(18, 80]']

fig.add_trace(go.Bar(x=df2.columns, y=df2.iloc[0],
                     name=groups[0],
                     marker_color = px.colors.qualitative.Plotly[3]),
    row=2, col=1)

fig.add_trace(go.Bar(x=df2.columns, y=df2.iloc[1],
                     name=groups[1],
                     marker_color = px.colors.qualitative.Plotly[4]),
    row=2, col=1)

fig.update_layout(title=dict(text='Titanic survivors by sex and age group'), barmode='stack', xaxis = dict(tickvals= df1.columns))
fig.show()

fig.show()

我設法使用add_bar函數生成子圖。

代碼:

from plotly.subplots import make_subplots

# plotly can only support one legend per graph at the moment.
fig = make_subplots(
    rows=1, cols=2,
    subplot_titles=("Pclass vs. Survived", "Sex vs. Survived")
)
fig.add_bar(
    x=train_df[train_df.Survived == 0].Pclass.value_counts().index,
    y=train_df[train_df.Survived == 0].Pclass.value_counts().values,
    text=train_df[train_df.Survived == 0].Pclass.value_counts().values,
    textposition='auto',
    name='Survived = 0',
    row=1, col=1
)
fig.add_bar(
    x=train_df[train_df.Survived == 1].Pclass.value_counts().index,
    y=train_df[train_df.Survived == 1].Pclass.value_counts().values,
    text=train_df[train_df.Survived == 1].Pclass.value_counts().values,
    textposition='auto',
    name='Survived = 1',
    row=1, col=1
)
fig.add_bar(
    x=train_df[train_df.Survived == 0].Sex.value_counts().index,
    y=train_df[train_df.Survived == 0].Sex.value_counts().values,
    text=train_df[train_df.Survived == 0].Sex.value_counts().values,
    textposition='auto',
    marker_color='#636EFA',
    showlegend=False,
    row=1, col=2
)
fig.add_bar(
    x=train_df[train_df.Survived == 1].Sex.value_counts().index,
    y=train_df[train_df.Survived == 1].Sex.value_counts().values,
    text=train_df[train_df.Survived == 1].Sex.value_counts().values,
    textposition='auto',
    marker_color='#EF553B',
    showlegend=False,
    row=1, col=2
)

fig.update_layout(
    barmode='stack',
    height=400, width=1200,
)
fig.update_xaxes(ticks="inside")
fig.update_yaxes(ticks="inside", col=1)
fig.show()

結果圖: 使用 plotly 生成的預期堆積條形圖

希望這對像我這樣的plotly新手有所幫助。

暫無
暫無

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

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