#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 по отдельности?