Я пытаюсь построить радарную диаграмму, где каждая линия имеет разный цвет.
Я чувствую, что внимательно следил за документом, и теперь я столкнулся с ошибкой, которую не могу решить, особенно потому, что НЕ выводится ОШИБКА!
вот некоторые фиктивные данные, с которыми я работаю:
r = [52,36,85]
theta = ["analytique", "analogique", "affectif"]
colors = ["blue", "red","yellow"]
Вот что у меня есть для моего графика:
for i in range(len(theta)):
fig_reception.add_trace(go.Scatterpolar(
mode='lines+text',
theta=[theta[i]],
r=[r[i]],
, line_color=text_colors[i],
fillcolor='#d3d3d3',
marker=dict(color=text_colors),
))
fig_reception.update_layout(autosize=False,
height=305,
polar=dict(radialaxis = dict(range=[0,100],visible = False),
angularaxis=dict(rotation=180,direction = "clockwise") )
)
fig_reception.update_layout(
template=None,
polar = dict(bgcolor = "rgba(255, 255, 255, 0.2)"),)
fig_reception.update_layout(
font=dict(
size=16,
color = "black",
family = "Courier New, monospace",
),
title = "Réception",
title_font_family = "Courier New, monospace",
showlegend=False
)
что странно, когда я наводил курсор на каждую строку, появляется рамка с правильным цветом и значением.
Вот картинка
Думаю, я могу ошибаться, но для себя я создаю трассировку для каждого значения внутри тета-списка, что составляет 4 трассы. Да, позвольте мне уточнить, в конце он должен показать традиционную радиолокационную диаграмму с 3 линиями (четвертая нужна для завершения треугольника, но это просто повторение). ТАК в основном треугольник, где каждый сегмент имеет свой цвет
У меня нет полного решения для вас, но я надеюсь, что мой ответ приведет вас в правильном направлении.
Во-первых, давайте упростим и построим график радара / шпиона с цветами по умолчанию:
import plotly.express as px
import pandas as pd
r = [52,36,85]
theta = ["analytique", "analogique", "affectif"]
types = ["one", "two","three"]
df = pd.DataFrame(dict(r=r, theta=theta, type=types))
df
Построение графика с помощью plotly.express.line_polar дает:
fig = px.line_polar(df, r='r', theta='theta', line_close=True, markers=True)
fig.show()
Теперь вы хотите, чтобы каждое ребро имело свой цвет. Ради этого примера я предполагаю, что вы хотите, чтобы этот цвет был основан на столбце type
, который я определил ранее.
Простое построение этого сразу не сработает, оно даст вам только точки, а не линии:
fig = px.line_polar(df, r='r', theta='theta', line_close=True, color='type', markers=True)
fig.show()
Вам нужно продублировать строки и назначить одинаковые последовательные точки данных type
.
# First append the df to itself, but only keep the r and theta columns
# This will make the type column NaN for the appended rows
df2 = pd.concat([df, df[['r', 'theta']]]).sort_values(by=['r', 'theta'])
# Now fill the NaN type value by taking the type value of the next row
df2.type.fillna(method='bfill', inplace=True)
# The last type value should be equal to the first type value to close the loop
# This needs to be set manually
df2.type.fillna(df2.type.iloc[0], inplace=True)
df2
Теперь, если вы построите это, вы получите треугольник с каждым краем, имеющим отдельный цвет:
fig = px.line_polar(df2, r='r', theta='theta', color='type', line_close=True, markers=True)
fig.show()
Не уверен, почему категории изменили порядок, но вы, вероятно, можете исправить это, отсортировав df2
DataFrame по-другому.
Если вы хотите, чтобы на вашем графике были текстовые метки, вы найдете в документах, что есть text
параметр:
fig = px.line_polar(df2, r='r', theta='theta', color='type', text='r', line_close=True, markers=True)
fig.update_traces(textposition='top center')
большое спасибо, я вижу ваше решение, оно умное, позвольте мне попробовать, чтобы увидеть!
шляпа снята, сэр, теперь моя работа - заставить ее работать с go.scatterpolar
Библиотека plotly express использует go.scatterpolar под капотом, вы можете получить доступ к объектам через fig.data или что-то в этом роде. Но для чего вам нужен go.scatterpolar? Почему библиотеки px недостаточно?
Я могу ошибаться, но мне кажется, что px.line_polar не позволяет записать значение "r" на графике, как будто нет параметра режима
@Murcielago, обновил мой ответ. Проверьте документы для сюжетного экспресса, чтобы узнать, что еще он может сделать.
никак, лол! Я потратил довольно много времени, пытаясь сделать это, ну, на самом деле, я пытаюсь получить это значение за пределами круга, я думал, что путь может быть рассеянным, но еще не выяснил, это может быть не так. даже возможно. tbh, документ показывает примеры как для px.line_polar, так и для go.scatterpolar, но не объясняет, когда что выбирать, у вас есть совет по этому поводу?
Я всегда выбираю px
, так как он может делать 90% того, что мне нужно. Только когда нужны очень специфические настройки графика, я прибегаю к go
. Но даже в этих случаях я сначала создаю базовый график с помощью библиотеки px
, а затем редактирую объекты go
, перебирая объект fig.data
. Он содержит кортеж из go
объектов. Также есть функции, которые могут перебирать трассы.
хороший совет, буду иметь в виду!
Я не полностью понимаю: ваши данные имеют только 1 трассировку, поэтому у них будет только 1 цвет. Если вы хотите несколько цветов, вам понадобится несколько следов. Не могли бы вы пояснить, как должен выглядеть сюжет радара/шпиона в конце?