Go.scatterpolar : попытка отобразить радиолокационный график с разными цветами линий не работает

Я пытаюсь построить радарную диаграмму, где каждая линия имеет разный цвет.

Я чувствую, что внимательно следил за документом, и теперь я столкнулся с ошибкой, которую не могу решить, особенно потому, что НЕ выводится ОШИБКА!

вот некоторые фиктивные данные, с которыми я работаю:

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
)

что странно, когда я наводил курсор на каждую строку, появляется рамка с правильным цветом и значением.

Вот картинка

Я не полностью понимаю: ваши данные имеют только 1 трассировку, поэтому у них будет только 1 цвет. Если вы хотите несколько цветов, вам понадобится несколько следов. Не могли бы вы пояснить, как должен выглядеть сюжет радара/шпиона в конце?

Saaru Lindestøkke 06.02.2023 18:11

Думаю, я могу ошибаться, но для себя я создаю трассировку для каждого значения внутри тета-списка, что составляет 4 трассы. Да, позвольте мне уточнить, в конце он должен показать традиционную радиолокационную диаграмму с 3 линиями (четвертая нужна для завершения треугольника, но это просто повторение). ТАК в основном треугольник, где каждый сегмент имеет свой цвет

Murcielago 06.02.2023 18:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня нет полного решения для вас, но я надеюсь, что мой ответ приведет вас в правильном направлении.

Простой старт

Во-первых, давайте упростим и построим график радара / шпиона с цветами по умолчанию:

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
р тета тип 0 52 аналитический один 1 36 аналог два 2 85 аффективный три

Построение графика с помощью 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
р тета тип 1 36 аналог два 1 36 аналог один 0 52 аналитический один 0 52 аналитический три 2 85 аффективный три 2 85 аффективный два

Теперь, если вы построите это, вы получите треугольник с каждым краем, имеющим отдельный цвет:

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

большое спасибо, я вижу ваше решение, оно умное, позвольте мне попробовать, чтобы увидеть!

Murcielago 06.02.2023 18:41

шляпа снята, сэр, теперь моя работа - заставить ее работать с go.scatterpolar

Murcielago 06.02.2023 19:01

Библиотека plotly express использует go.scatterpolar под капотом, вы можете получить доступ к объектам через fig.data или что-то в этом роде. Но для чего вам нужен go.scatterpolar? Почему библиотеки px недостаточно?

Saaru Lindestøkke 06.02.2023 20:20

Я могу ошибаться, но мне кажется, что px.line_polar не позволяет записать значение "r" на графике, как будто нет параметра режима

Murcielago 06.02.2023 21:51

@Murcielago, обновил мой ответ. Проверьте документы для сюжетного экспресса, чтобы узнать, что еще он может сделать.

Saaru Lindestøkke 06.02.2023 22:04

никак, лол! Я потратил довольно много времени, пытаясь сделать это, ну, на самом деле, я пытаюсь получить это значение за пределами круга, я думал, что путь может быть рассеянным, но еще не выяснил, это может быть не так. даже возможно. tbh, документ показывает примеры как для px.line_polar, так и для go.scatterpolar, но не объясняет, когда что выбирать, у вас есть совет по этому поводу?

Murcielago 06.02.2023 22:17

Я всегда выбираю px, так как он может делать 90% того, что мне нужно. Только когда нужны очень специфические настройки графика, я прибегаю к go. Но даже в этих случаях я сначала создаю базовый график с помощью библиотеки px, а затем редактирую объекты go, перебирая объект fig.data. Он содержит кортеж из go объектов. Также есть функции, которые могут перебирать трассы.

Saaru Lindestøkke 06.02.2023 22:23

хороший совет, буду иметь в виду!

Murcielago 06.02.2023 22:56

Другие вопросы по теме