Сюжетно Выраженный: Адресация Подзаголовков

#python #html #plotly #subplot #plotly-python

#питон #HTML #сюжетно #подзаголовок #сюжетно-питон

Вопрос:

После того, как я уже несколько часов искал в Интернете, я абсолютно разочарован и запутался в том, как обращаться к подзаголовкам с plotly express помощью Python.

Моя идея состоит в том, чтобы построить линейную диаграмму рядом с точечной диаграммой и линейной диаграммой и определить метки, данные наведения и т. Д. По Отдельности добавьте к ним фигуры и текст.

Однако то, что я придумал до сих пор, использует make_subplots и принимает только следы. Следовательно, все форматирование фигур сюжетного выражения теряется в подзаголовках!

Я нашел только способ изменить границы осей отдельных подстрок, но не способ добавления настраиваемого шаблона наведения, меток x, меток y и т. Д.

 import pandas as pd  import plotly.express as px   # CREATE 2 PLOTS with PLOTY EXPRESS ----------------------------------------------------  ## fig 1 is a time series of two properties "type"  fig1 = px.line(df, x="year", y="total", color="type", title="layout.hovermode='x'")   fig1.update_traces(mode="markers lines", hovertemplate=None)  fig1.update_layout(hovermode="x unified")   fig1.add_shape(type="line",  x0=2016,   y0=0,   x1=2016,   y1=800,  line=dict(  color="gray",  width=2,  dash="dot"))   ## fig2 is a cross-plot of two properties "type"   fig2 = px.scatter(data_frame=df,  x='activity_2011_2015', y='activity_2016_2020',   #size='costs',  color='type')   # add x=y line  fig2.add_shape(type="line",  x0=0,   y0=0,   x1=600,   y1=600,  line=dict(  color="gray",  width=2,  dash="dot"))   # CREATE 1x2 SUBPLOTS ----------------------------------------------------  fig1_traces = []  fig2_traces = []    for trace in range(len(fig1["data"])):  fig1_traces.append(fig1["data"][trace])  for trace in range(len(fig2["data"])):  fig2_traces.append(fig2["data"][trace])     sub_fig = sp.make_subplots(rows=1, cols=2,   subplot_titles=['time series', 'cross-plot'],  horizontal_spacing=0.1)    for traces in fig1_traces:  sub_fig.append_trace(traces, row=1, col=1)  for traces in fig2_traces:  sub_fig.append_trace(traces, row=1, col=2)    ## Address x axis and y axis range of first figure -----------------------------  sub_fig.update_layout(xaxis1 = dict(  tickmode = 'array',  range=[2015,2020],  tickvals = np.arange(2015, 2020, 1).tolist())  )     sub_fig.show()  sub_fig.write_html("sub_fig.html", include_plotlyjs="cdn")  
  • Как я могу обратиться к отдельным фигурам и их элементам в подзаголовках? Я хочу добавить фигуры обратно, добавить настроенные данные наведения и отформатировать оси X и Y по отдельности, потому что графики не имеют одинаковых единиц измерения…
  • Если это невозможно, можно ли воссоздать этот код по-другому? Все, что мне нужно,-это два сюжета, бок о бок, и взаимодействовать с ними…

Вот как должны выглядеть подзаголовки

Заранее большое вам спасибо!

Ответ №1:

  • все дело в том, чтобы быть систематичным. Каждая грань вложенного участка использует свои собственные оси.
  • следовательно, чтобы скопировать фигуры в интегрированный макет, вам нужно расположить их по соответствующим осям
 for t in fig1.data:  sub_fig.add_trace(t, row=1, col=1) for t in fig2.data:  sub_fig.add_trace(t, row=1, col=2)    for s in fig1.to_dict()["layout"]["shapes"]:  sub_fig.add_shape(s)  for s in fig2.to_dict()["layout"]["shapes"]:  sub_fig.add_shape({**{"xref":"x2", "yref":"y2"}, **s})   sub_fig  

введите описание изображения здесь

моделирование фрейма данных

 df = pd.DataFrame({"year":np.tile(range(2010,2010 10),2), "total":np.random.randint(300,800,20), "type":np.repeat(["a","b"],10),  'activity_2011_2015':np.random.randint(0,600,20), 'activity_2016_2020':np.random.randint(0,600,20)})    

Комментарии:

1. Спасибо за отзыв! Это в целом отвечает на вопрос, но как я могу а) сохранить стиль наведения fig1, б) изменить размеры рисунка (например, сделать fig1 шире, чем fig2) и, наконец, в) изменить метки осей x/y по отдельности?