wex*_*x52 13 python subplot plotly choropleth
我明白,如果我想设置所有的子情节标题,那么我可以在声明图形时做到这一点。
import pandas as pd
import plotly.graph_objs as go
from plotly.subplots import make_subplots
fig = make_subplots(
###
subplot_titles=['Plot 1', 'Plot 2', 'Plot 3', 'Plot 4', etc.]
)
Run Code Online (Sandbox Code Playgroud)
但是,我在一个循环中创建了每个子图,我认为在该过程中设置每个子图的标题是最简单的。就我而言,我根据日期创建了一个 groupby 对象,然后遍历每个组(日期)数据框。每个数据框用于创建子图,我希望标题是日期。我知道我可以在循环之前弄清楚这一点并将 subplot_titles 设置为正常,但它似乎是循环中的单行。如果重要的话,我添加的痕迹是 choropleths。我不打算包含工作数据集,因为我的代码工作正常 - 我只想知道我需要添加哪行代码。
#Create groupby object, splitting data frame into separate data frames based on 'State'
death_counts_gbo = death_counts_by_week.groupby('End Week')
#Prepare subplots for choropleths
rows = 4
cols = 7
fig = make_subplots(
rows=rows, cols=cols,
specs = [[{'type': 'choropleth'} for c in np.arange(cols)] for r in np.arange(rows)],
)
#Graph each state's data
for i, (date, df) in enumerate(death_counts_gbo):
fig.add_trace(go.Choropleth(
locations=df['State Abbr'], # Spatial coordinates
z = df['COVID-19 Deaths per 100k'].astype(float), # Data to be color-coded
locationmode = 'USA-states', # set of locations match entries in `locations`
colorscale = 'Reds',
zmin = 0,
zmax = 30,
colorbar_title = "Deaths per 100k",
text = date.strftime('%m-%d-%Y')
), row=i//7+1, col=i%7+1)
### This is where I'd like to set the subplot's title to 'date' ###
# Set title of entire figure
# Set each subplot map for the USA map instead of default world map
# Set each subplot map's lake color to light blue
fig.update_layout(
title_text = 'COVID-19 Deaths per 100k at week ending',
**{'geo' + str(i) + '_scope': 'usa' for i in [''] + np.arange(2,len(death_counts_gbo)+1).tolist()},
**{'geo' + str(i) + '_lakecolor': 'lightblue' for i in [''] + np.arange(2,len(death_counts_gbo)+1).tolist()},
)
fig.show()
Run Code Online (Sandbox Code Playgroud)
编辑:对于我的示例,我可以在图形声明期间使用以下 kwarg 设置子图标题:
subplot_titles = [date.strftime('%m-%d-%Y') for date in list(death_counts_gbo.groups.keys())]
Run Code Online (Sandbox Code Playgroud)
但是,为了我自己的启发,如果我将来有更多涉及字幕确定的情况,我仍然想知道如何在循环期间/图形声明之后设置它。
EDIT2:感谢@rpanai,我有一个解决方案,尽管它需要更改我的make_subplots
声明,以及循环中的单行。他告诉我,字幕是存储在fig.layout.annotations
其中的注释,虽然可能会向其提供字幕列表,但计算适当的x
和y
坐标可能会很麻烦。我通过创建临时字幕并强制make_subplots
计算x
和y
坐标来解决这个问题。然后我更新了循环中的文本。
更新的make_subplots
图形声明(添加了 subplot_titles):
fig = make_subplots(
rows=rows, cols=cols,
specs = [[{'type': 'choropleth'} for c in np.arange(cols)] for r in np.arange(rows)],
subplot_titles = ['temp_subtitle' for date in np.arange(len(death_counts_gbo))]
)
Run Code Online (Sandbox Code Playgroud)
单行(for循环的第一行):
fig.layout.annotations[i]['text'] = date.strftime('%m-%d-%Y')
Run Code Online (Sandbox Code Playgroud)
ves*_*and 19
您提到您希望在构建图形后也能够编辑标题(即注释) 。如果您已经有了一些标题,并且想要更改它们,您可以fig.for_each_annotation()
与这样的字典结合使用:
names = {'Plot 1':'2016', 'Plot 2':'2017', 'Plot 3':'2018', 'Plot 4':'2019'}
fig.for_each_annotation(lambda a: a.update(text = names[a.text]))
Run Code Online (Sandbox Code Playgroud)
这将变成:
进入这个:
您还可以轻松地将现有标题与您选择的附加内容结合起来:
fig.for_each_annotation(lambda a: a.update(text = a.text + ': ' + names[a.text]))
Run Code Online (Sandbox Code Playgroud)
from plotly.subplots import make_subplots
import plotly.graph_objects as go
fig = make_subplots(
rows=2, cols=2,
subplot_titles=("Plot 1", "Plot 2", "Plot 3", "Plot 4"))
fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]),
row=1, col=1)
fig.add_trace(go.Scatter(x=[20, 30, 40], y=[50, 60, 70]),
row=1, col=2)
fig.add_trace(go.Scatter(x=[300, 400, 500], y=[600, 700, 800]),
row=2, col=1)
fig.add_trace(go.Scatter(x=[4000, 5000, 6000], y=[7000, 8000, 9000]),
row=2, col=2)
fig.update_layout(height=500, width=700,
title_text="Multiple Subplots with Titles")
names = {'Plot 1':'2016', 'Plot 2':'2017', 'Plot 3':'2018', 'Plot 4':'2019'}
# fig.for_each_annotation(lambda a: a.update(text = names[a.text]))
fig.for_each_annotation(lambda a: a.update(text = a.text + ': ' + names[a.text]))
fig.show()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3082 次 |
最近记录: |