#plotly #bar-chart #positioning
#plotly #гистограмма #позиционирование
Вопрос:
Как я могу поместить фигуру в категориальную столбчатую диаграмму ниже в середине строки, указывающей количество жирафов в зоопарке SF (как показано пурпурным цветом на прилагаемом рисунке)?
import plotly.graph_objects as go
import plotly.express as px
animals=['giraffes', 'orangutans', 'monkeys']
fig = go.Figure(data=[
go.Bar(name='SF Zoo', x=animals, y=[20, 14, 23]),
go.Bar(name='LA Zoo', x=animals, y=[12, 18, 29])
])
# Change the bar mode
fig.update_layout(barmode='group')
# Shape
fig.add_trace(go.Scatter(x=['giraffes', 'giraffes', 'orangutans', 'orangutans'],
y=[21, 25, 25, 16],
fill=None, mode="lines", line=dict(color='rgba(0,0,0,1)',width=2),
showlegend=False
)
)
fig.show()
Комментарии:
1. Я не думаю, что это возможно без какого-либо хакерского / хрупкого решения.
Ответ №1:
Как указал @Maximilian Peters, не существует хорошего способа привязки точки к произвольной величине между категориальными координатами.
Лучшее, что вы можете сделать, это установить xref
paper
значение, означающее, что масштаб оси x составляет от 0 до 1. Затем вам нужно угадать и проверить, где должны быть координаты x, чтобы выровнять их там, где вы хотите. Поскольку ваша ось y является числовой, вы можете напрямую ссылаться на нужные вам значения y. После некоторых проб и ошибок, рисование линий между (0.10, 20), (0,10, 25), (0.44, 25), (0.44, 14) приближает вас к желаемой аннотации.
Это определенно халтурно и не поддается обобщению, если вы добавляете больше столбцов или каким-либо образом изменяете ширину столбцов.
import plotly.graph_objects as go
import plotly.express as px
animals=['giraffes', 'orangutans', 'monkeys']
fig = go.Figure(data=[
go.Bar(name='SF Zoo', x=animals, y=[20, 14, 23]),
go.Bar(name='LA Zoo', x=animals, y=[12, 18, 29])
])
# Change the bar mode
fig.update_layout(barmode='group')
# Shape composed of three lines, looping through coordinates
x_coords = [0.10, 0.10, 0.44, 0.44]
y_coords = [20, 25, 25, 14]
for i in range(1,len(x_coords)):
fig.add_shape(
type="line",
xref="paper",
x0=x_coords[i-1],
y0=y_coords[i-1],
x1=x_coords[i],
y1=y_coords[i],
line=dict(color="magenta",width=3)
)
fig.show()
Комментарии:
1. Большое спасибо @Derek O. Я подумал, что могу использовать абсолютное позиционирование через
xref="paper", yref="paper"
и, таким образом, рисовать 3 строки отдельно, однако цикл for выглядит более элегантно (все это ново для этого). Я надеюсь, что разработчики plotly предоставят лучшее решение этой проблемы и, в частности, статистические аннотации к категориальным данным в будущем. Мне нужно выполнить 2-сторонний ANOVA и добавить p-значения к аналогичному графику, но я еще не нашел способ, который был бы удобен для этого в Plotly?2. @hans yeah Plotly — классная библиотека, и интерактивные графики великолепны, но они приходят за счет возможности настройки. Определенно есть больше функций, связанных с категориальными гистограммами, которые необходимо добавить, и я не удивлюсь, если есть открытая проблема для этой конкретной проблемы. Если ваш вопрос о добавлении p-значений к вашей гистограмме отличается от этого вопроса, не стесняйтесь опубликовать новый вопрос, чтобы я или кто-то другой мог вам помочь с этим!