Как установить заголовок каждого подзаголовка во время создания графика l oop? - PullRequest
0 голосов
/ 02 августа 2020

Я понимаю, что если я хочу установить все заголовки подзаголовков, я могу это сделать, когда объявлю цифру.

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')
...