如何在 python 中使用 plotly 和 make_subplot 绘制不同类型的图表
how to plot different types of charts using plotly and make_subplot in python
我想绘制饼图和条形图的混合子图怎么办?
到目前为止,我可以绘制饼图,但如何添加条形图?
下面的代码执行 groupby 函数并迭代返回的对象,以便根据 groupby 对象的唯一值绘制多个饼图。
数据框:
event_type date event_mohafaza number_person groups
0 watch movie 2020-08-14 loc1 25 group1
1 stay at home 2020-08-14 loc3 32 group1
2 watch movie 2020-08-14 loc2 45 group2
3 swimming 2020-08-14 loc4 12 group1
4 stay at home 2020-08-14 loc2 45 group3
5 watch movie 2019-06-14 loc5 22 group1
6 watch movie 2020-08-14 loc2 10 group4
7 watch movie 2020-08-14 loc1 44 group1
8 stay at home 2020-08-14 loc3 22 group3
9 swimming 2020-08-14 loc2 32 group2
10 watch movie 2019-09-14 loc1 17 group1
11 camping 2020-08-14 loc4 27 group1
12 watch movie 2020-08-14 loc5 43 group3
13 meeting 2019-06-14 loc2 33 group2
14 camping 2020-08-14 loc1 21 group4
代码:
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# data for this example
import plotly.express as px
lst = list(df.groupby('event_mohafaza '))
# here we want our grid to be 2 x 3
rows = 2
cols = 3
# continents are the first element in l
subplot_titles = [l[0] for l in lst]
# a compact and general version of what you did
specs = [[{'type':'domain'}]* cols] * rows
fig = make_subplots(
rows=rows,
cols=cols,
subplot_titles=subplot_titles,
specs=specs,
print_grid=True)
for i, l in enumerate(lst):
# basic math to get col and row
row = i // cols + 1
col = i % (rows + 1) + 1
# this is the dataframe for every continent
d = l[1]
fig.add_trace(
go.Pie(labels=d["event_type"],
values = d["number_person"],
hovertemplate = "%{label}: <br>Value: %{value} ",
showlegend=True,
textposition='inside',
rotation=90
),
row=row,
col=col
)
# fig.add_trace(go.Bar(y=df.event_type, opacity=0.3), 1, 1)
fig.update_layout(title="Population by Continent", title_x=0.5)
fig.show()
我们修改了代码,认为我们要添加第六个条形图。目前尚不清楚您要添加哪种条形图,因此我已按照您认为合适的方式进行了设置。关键是你需要指定一个匹配子图结构的图。
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# data for this example
import plotly.express as px
lst = list(df.groupby('event_mohafaza'))
# here we want our grid to be 2 x 3
rows = 2
cols = 3
# continents are the first element in l
subplot_titles = [l[0] for l in lst]
# a compact and general version of what you did
# specs = [[{'type':'domain'}]* cols] * rows
specs = [[{"type": "pie"},{"type": "pie"},{"type": "pie"}],[{"type": "pie"},{"type": "pie"},{"type": "bar"}]]
fig = make_subplots(
rows=rows,
cols=cols,
subplot_titles=subplot_titles,
specs=specs,
print_grid=True)
for i, l in enumerate(lst):
# basic math to get col and row
row = i // cols + 1
col = i % (rows + 1) + 1
# this is the dataframe for every continent
d = l[1]
fig.add_trace(go.Pie(labels=d["event_type"],
values = d["number_person"],
hovertemplate = "%{label}: <br>Value: %{value} ",
showlegend=True,
textposition='inside',
rotation=90),
row=row,
col=col
)
fig.add_trace(go.Bar(x=df.groups, y=df.number_person, opacity=0.3, showlegend=False), row=2, col=3)
fig.update_layout(title="Population by Continent", title_x=0.5)
fig.show()
我想绘制饼图和条形图的混合子图怎么办?
到目前为止,我可以绘制饼图,但如何添加条形图?
下面的代码执行 groupby 函数并迭代返回的对象,以便根据 groupby 对象的唯一值绘制多个饼图。
数据框:
event_type date event_mohafaza number_person groups
0 watch movie 2020-08-14 loc1 25 group1
1 stay at home 2020-08-14 loc3 32 group1
2 watch movie 2020-08-14 loc2 45 group2
3 swimming 2020-08-14 loc4 12 group1
4 stay at home 2020-08-14 loc2 45 group3
5 watch movie 2019-06-14 loc5 22 group1
6 watch movie 2020-08-14 loc2 10 group4
7 watch movie 2020-08-14 loc1 44 group1
8 stay at home 2020-08-14 loc3 22 group3
9 swimming 2020-08-14 loc2 32 group2
10 watch movie 2019-09-14 loc1 17 group1
11 camping 2020-08-14 loc4 27 group1
12 watch movie 2020-08-14 loc5 43 group3
13 meeting 2019-06-14 loc2 33 group2
14 camping 2020-08-14 loc1 21 group4
代码:
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# data for this example
import plotly.express as px
lst = list(df.groupby('event_mohafaza '))
# here we want our grid to be 2 x 3
rows = 2
cols = 3
# continents are the first element in l
subplot_titles = [l[0] for l in lst]
# a compact and general version of what you did
specs = [[{'type':'domain'}]* cols] * rows
fig = make_subplots(
rows=rows,
cols=cols,
subplot_titles=subplot_titles,
specs=specs,
print_grid=True)
for i, l in enumerate(lst):
# basic math to get col and row
row = i // cols + 1
col = i % (rows + 1) + 1
# this is the dataframe for every continent
d = l[1]
fig.add_trace(
go.Pie(labels=d["event_type"],
values = d["number_person"],
hovertemplate = "%{label}: <br>Value: %{value} ",
showlegend=True,
textposition='inside',
rotation=90
),
row=row,
col=col
)
# fig.add_trace(go.Bar(y=df.event_type, opacity=0.3), 1, 1)
fig.update_layout(title="Population by Continent", title_x=0.5)
fig.show()
我们修改了代码,认为我们要添加第六个条形图。目前尚不清楚您要添加哪种条形图,因此我已按照您认为合适的方式进行了设置。关键是你需要指定一个匹配子图结构的图。
import plotly.graph_objs as go
from plotly.subplots import make_subplots
# data for this example
import plotly.express as px
lst = list(df.groupby('event_mohafaza'))
# here we want our grid to be 2 x 3
rows = 2
cols = 3
# continents are the first element in l
subplot_titles = [l[0] for l in lst]
# a compact and general version of what you did
# specs = [[{'type':'domain'}]* cols] * rows
specs = [[{"type": "pie"},{"type": "pie"},{"type": "pie"}],[{"type": "pie"},{"type": "pie"},{"type": "bar"}]]
fig = make_subplots(
rows=rows,
cols=cols,
subplot_titles=subplot_titles,
specs=specs,
print_grid=True)
for i, l in enumerate(lst):
# basic math to get col and row
row = i // cols + 1
col = i % (rows + 1) + 1
# this is the dataframe for every continent
d = l[1]
fig.add_trace(go.Pie(labels=d["event_type"],
values = d["number_person"],
hovertemplate = "%{label}: <br>Value: %{value} ",
showlegend=True,
textposition='inside',
rotation=90),
row=row,
col=col
)
fig.add_trace(go.Bar(x=df.groups, y=df.number_person, opacity=0.3, showlegend=False), row=2, col=3)
fig.update_layout(title="Population by Continent", title_x=0.5)
fig.show()