Я понимаю, что если я хочу установить все заголовки подзаголовков, я могу это сделать, когда объявлю цифру.
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.]
)
Однако я создаю каждый граф подзаголовка в al oop, и Я думаю, что было бы проще всего установить заголовок каждого подсюжета во время этого процесса. В моем случае я создал объект groupby на основе даты, а затем я l oop через каждый фрейм данных группы (даты). Каждый фрейм данных используется для создания графика подзаголовка, и я бы хотел, чтобы в заголовке была дата. Я понимаю, что я могу понять это до l oop и установить subplot_titles как обычно, но похоже, что это будет однострочник внутри l oop. Если это важно, я добавляю хороплетов. Я не собираюсь включать рабочий набор данных, поскольку мой код работает нормально - я просто хочу знать, какую строку кода мне нужно добавить.
#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()
РЕДАКТИРОВАТЬ: В моем примере я могу установить подзаголовок заголовки во время объявления рисунка со следующим kwarg:
subplot_titles = [date.strftime('%m-%d-%Y') for date in list(death_counts_gbo.groups.keys())]
Однако, для моего собственного назидания, и если у меня будет случай в будущем, когда определение подзаголовка будет более сложным, я все же хотел бы знать, как установите его во время l oop / после объявления фигуры.
EDIT2: Благодаря @rpanai у меня есть решение, хотя оно потребовало изменения в моем make_subplots
объявлении в дополнение к однострочному в л oop. Он сообщил мне, что субтитры - это аннотации, хранящиеся в fig.layout.annotations
, и что, хотя список субтитров может быть предоставлен ему, вычисление соответствующих координат x
и y
может быть проблемой. Я решил эту проблему, создав временные субтитры и заставив make_subplots
вычислять координаты x
и y
. Затем я обновил текст в l oop.
Обновленное объявление make_subplots
figure (добавлены 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))]
)
Однострочный (первая строка for-l oop):
fig.layout.annotations[i]['text'] = date.strftime('%m-%d-%Y')