#python #python-3.x #plotly
#python #python-3.x #plotly
Вопрос:
Я пытаюсь получить две сложенные столбчатые диаграммы рядом, но не могу понять это.
Вот пример df:
Field Issue
Police Budget cuts
Research Budget cuts
Police Time consuming
Banking Lack of oversight
Healthcare Lack of support
Research Bureaucracy
Healthcare Bureaucracy
Banking Mistrust
Сначала я хочу сложенную столбчатую диаграмму поля. Она будет иметь высоту 8, разбитую на 2 police, 2 x research и т.д. Затем я хочу, чтобы рядом с первой диаграммой была сложенная столбчатая диаграмма проблемы. Эта вторая диаграмма будет иметь высоту 8 и будет разделена на 2 раза сокращением бюджета, 1 раз затратой времени, 1 раз отсутствием надзора и т.д.
Я пытался:
чтобы получить сложенную столбчатую диаграмму всех полей:
trace1 = go.Bar(
x = df.Field.unique(),
y = df.Field.value_counts(),
name='Total Amount of roles'
)
чтобы получить сложенную столбчатую диаграмму сокращения бюджета (затем повторить для других проблем):
trace2 = go.Bar(
x = df.Field.unique(),
y = df[df['Issue'] == 'Budget cuts'].Field.value_counts(),
name='Budget cuts'
)
data = [trace1, trace2]
layout = go.Layout(barmode='stack')
fig = go.Figure(data=data, layout=layout)
py.plot(fig, filename='test.html')
Но приведенный выше код объединяет два графика в один. Я хочу, чтобы трассировка 1 была сложена и трассировка 2 была сложена. Я также хочу, чтобы это было интегрировано в Dash, а не в plotly само по себе, но, честно говоря, это было бы вторично. Был бы признателен за любую помощь!
Комментарии:
1.
pyo.plot(fig, filename='test.html')
Вы, должно быть, имели в видуpy.plot(fig, filename='test.html')
? Это, конечно, зависит от того, как выглядит ваш импорт, но я все равно его изменил.
Ответ №1:
РЕДАКТИРОВАТЬ — после короткого диалога в комментариях это мое последнее предложение:
Вот возможное решение с подсчетом каждого появления каждой категории, уложенной в столбец (поле или проблему):
Построить:
Код:
Как вы можете видеть, это не очень гибко, поскольку вам придется добавлять по одному go.Bar
объекту для каждой категории (банковское дело, полиция и т.д.). Но если приведенный выше график — это то, что вы ищете, я разберусь и с этой частью.
# import
import pandas as pd
import numpy as np
import plotly.graph_objs as go
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot
init_notebook_mode(connected=True)
#%qtconsole
# sample data
Field = ['Police', 'Research', 'Police', 'Banking', 'Healthcare', 'Research', 'Healthcare', 'Banking']
Issue = ['Budget cuts', 'Budget cuts', 'Time consuming', 'Lack of oversight', 'Lack of support', 'Bureaucracy', 'Bureaucracy', 'Mistrust']
# Put the lists in a pandas dataframe for
# easy grouping and indexing
df = pd.DataFrame([Field, Issue]).T
df.columns = ['Field', 'Issue']
grField = df.groupby('Field').count()
grIssue = df.groupby('Issue').count()
dfgr = pd.concat([grField, grIssue], axis = 1, sort = False)
dfgr = dfgr.T
# Make one go.Bar() object for each category
# for corresponing Field / Issue
trace1 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Banking'].loc['Issue']],
name='Banking')
trace2 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Healthcare'].loc['Issue']],
name='Healthcare')
trace3 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Police'].loc['Issue']],
name='Police')
trace4 = go.Bar(
x = ['Issue'],
#y = [dfgr['Field']],
y = [dfgr['Research'].loc['Issue']],
name='Research')
trace5 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Budget cuts'].loc['Field']],
name='Budget cuts')
trace6 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Bureaucracy'].loc['Field']],
name='Bureaucracy')
trace7 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of oversight'].loc['Field']],
name='Lack of oversight')
trace7 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of oversight'].loc['Field']],
name='Lack of oversight')
trace8 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Lack of support'].loc['Field']],
name='Lack of support')
trace9 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Mistrust'].loc['Field']],
name='Mistrust')
trace10 = go.Bar(
x = ['Field'],
#y = [dfgr['Field']],
y = [dfgr['Time consuming'].loc['Field']],
name='Time consuming')
# gather data and set up layout
#data = [trace1, trace2, trace3, trace4, trace5, trace6, trace7, trace8, trace9, trace10]
data = [trace10, trace9, trace8, trace7, trace6, trace5, trace4, trace3, trace2, trace1]
layout = go.Layout(barmode='stack', title = 'Stacked bar chart from single column')
# Build figure
fig = go.Figure(data=data, layout=layout)
# PLot figure
iplot(fig, filename='test.html')
Комментарии:
1. Привет, Вестланд, спасибо за код. Итак, этот график — это то, что у меня есть сейчас, и вот как я это сделал. То, что я ищу, — это, по сути, один сложенный столбик, показывающий, что есть 2 полиции, 2 исследования и т.д. высотой 8 (потому что есть 8 полей) и вторая сложенная столбчатая диаграмма для проблем высотой 8 (сложенная по высоте 2 для сокращения бюджета, одна для отнимания времени и т.д.). Одна сложенная диаграмма для отображения разбивки по количеству полей рядом с одной сложенной диаграммой, чтобы показать разбивку по количеству проблем. Имеет ли это смысл? Спасибо
2. @user8322222 Итак, тогда два столбца? В этом случае проблема здесь заключается в преобразовании данных, а не в самом графике, вот в чем проблема. Я посмотрю на это.
3. Да, всего 2 столбца. Спасибо Vestland.
4. Нет проблем, но мы еще не достигли этого. Завтра я посмотрю еще раз.
5. @user8322222 Рад помочь! Если мое предложение отвечает на ваш вопрос, пожалуйста, подумайте о том, чтобы пометить его как принятый ответ. И не волнуйтесь, я найду время, чтобы сделать его более гибким, поскольку мне это тоже очень интересно. Любые другие детали можно обсудить в установленном чате.
Ответ №2:
Фрагменты рабочего кода, на случай, если это то, что вам нужно:
import plotly.graph_objects as go
x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
base = 0, width = 0.2, offset = 0.0,
marker = dict(color = 'rgb(0,120,255)')))
fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,130,0)')))
fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()
альтернативный макет:
change: base,offset of second figure
import plotly.graph_objects as go
x=['a','b','c','d']
fig = go.Figure(go.Bar(x =x, y=[2,5,1,9], name='Montreal',
base = 0, width = 0.2, offset = 0.0,
marker = dict(color = 'rgb(0,120,255)')))
fig.add_trace(go.Bar(x=x, y=[1, 4, 9, 16], name='Ottawa',
width = 0.2, offset = -0.4, base=0,
marker = dict(color = 'rgb(250,60,0)')))
fig.add_trace(go.Bar(x=x, y=[6, 8, 4.5, 8], name='Toronto',
width = 0.2, offset = -0.2,
marker = dict(color = 'rgb(250,130,0)')))
fig.update_layout(barmode='stack', xaxis={'categoryorder':'array', 'categoryarray':['d','a','c','b']})
fig.show()