Plotly: Как создать сюжеты с python? - PullRequest
1 голос
/ 26 января 2020

Мне интересно, как лучше всего создавать подзаговоры, используя Python Plotly. Используется ли plotly.express или standard plotly.graph_objects?

Я пытаюсь создать фигуру с двумя вспомогательными участками, которые представляют собой гистограммы с накоплением. Следующий код не работает. Я не нашел ничего полезного в официальной документации. Набор данных classi c Titani c был импортирован как 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()

Я получил следующий рисунок:

enter image description here

То, что я ожидаю, выглядит следующим образом:

enter image description here

Ответы [ 3 ]

1 голос
/ 27 января 2020

Я надеюсь, что существующий ответ соответствует вашим потребностям, но я просто хотел бы отметить, что в заявлении

невозможно разбить разбивку на столбики ставок (поскольку столбец с накоплением находится на фасетированных фигурах и не трассировка

не совсем корректна. Построить сюжетную диаграмму можно с помощью составных гистограмм, если правильно составить ее, используя add_trace() и go.Bar(). И это также отвечает вашим вопрос относительно:

Мне интересно, что является наилучшей практикой для создания подзаговоров с использованием Python Plotly. Это использовать плотно. express или стандартный plotly.graph_objects?

Используйте plotly.express, если вы найдете подход px, который соответствует вашим потребностям. Как и в вашем случае, когда вы do not найдете его, создайте свои собственные подсюжеты, используя plotly.graphobjects.

Ниже пример, который покажет вам один такой возможный подход с использованием набора данных titanic. Обратите внимание, что имена столбцов не совпадают с вашими, поскольку нет заглавных букв. Суть этого утверждения заключается в том, что вы используете go.Bar() для каждой трассы и указываете, куда поместить эти трассы, используя аргументы row и col в go.Bar(). Если вы назначите несколько кривых для одного и того же row и col, вы получите вложенные графики гистограммы, если указать barmode='stack' в fig.update_layout(). Using px.colors.qualitative.Plotly [i] `позволит вам назначать цвета из Стандартный график цветового цикла последовательно.

Сюжет:

enter image description here

Код:

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()
1 голос
/ 28 января 2020

Мне удалось создать вспомогательные участки с помощью функции 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()

Итоговый сюжет: Expected stacked bar charts generated using plotly

Надеюсь, это поможет новичкам по сюжету, как я.

1 голос
/ 27 января 2020

Из того, что я знаю, невозможно выложить разбитый столбец (так как столбчатые столбцы находятся на фасетных фигурах, а не на трассах) ...

От имени 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...