Как раскрасить маркеры на основе другого столбца в кадре данных в Plotly? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть датафрейм, как показано ниже, с 3 столбцами. Я использую clump в качестве значений x и размер Unif в качестве значений y для формирования диаграммы рассеяния. Но я хочу раскрасить отдельные точки на основе класса третьего столбца. Точки, имеющие классовые значения 2 зеленого цвета и 4 - синего цвета.

Итак, взяв первые и последние точки в кадре данных в качестве примеров. Первая точка будет иметь значение x 5, значение y 1 с зеленым цветом, в то время как последняя точка будет иметь значение x 4, значение y 8 и синий цвет

Я пытался используя оператор if, как показано, но я получаю синтаксические ошибки. Любые идеи о том, как это сделать?

 fig = go.Figure()
 fig.update_layout(width = 400, height = 400, template = 'plotly_white',xaxis_title = 'clump', yaxis_title = 'Unif Size')
 fig.add_trace(go.Scatter(x = data.Clump,
                          y = data.UnifSize,
                          mode = 'markers',
                          if data.Class == 2:
                              marker = duct(
                              color = 'green'
                              ) 
                          if data.Class == 4:
                             marker = dict(
                             color = 'yellow'
                             )
                     )))

enter image description here

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете сделать, например, это:

Создать пример x и y данных с массивом, содержащим условие, от которого будет зависеть цвет:

import numpy as np
x = [x for x in range(100)]
y = [3*each*np.random.normal(loc=1.0, scale=0.1) for each in range(100)]
condition = [np.random.randint(0,2) for x in range(100)]

Точки x и y, индекс которых соответствует 0 в массиве условий:

[eachx for indexx, eachx in enumerate(x) if condition[indexx]==0]
[eachy for indexy, eachy in enumerate(y) if condition[indexy]==0]

Если мы хотим, чтобы элементы в массивах x и y имели индекс, соответствующий на 1 в массиве условий мы просто изменим 0 на 1:

[eachx for indexx, eachx in enumerate(x) if condition[indexx]==1]
[eachy for indexy, eachy in enumerate(y) if condition[indexy]==1]

В качестве альтернативы вы можете использовать zip:

[eachx for eachx, eachcondition in zip(x, condition) if eachcondition==0]

И так для остальных.

Это понимание списка с условием, хорошо объясненным здесь: { ссылка }.

Затем построите 2 пары массивов с помощью 2 go.Scatter звонки.

Все вместе:

import numpy as np
x = [x for x in range(100)]
y = [3*each*np.random.normal(loc=1.0, scale=0.1) for each in range(100)]
condition = [np.random.randint(0,2) for x in range(100)]

import plotly.graph_objects as go
fig = go.Figure()
fig.update_layout(width = 400, height = 400, template = 'plotly_white',xaxis_title = 'clump', yaxis_title = 'Unif Size')
fig.add_trace(go.Scatter(x = [eachx for indexx, eachx in enumerate(x) if condition[indexx]==0],
                        y = [eachy for indexy, eachy in enumerate(y) if condition[indexy]==0],
                        mode = 'markers',marker = dict(color = 'green')))
fig.add_trace(go.Scatter(x = [eachx for indexx, eachx in enumerate(x) if condition[indexx]==1],
                        y = [eachy for indexy, eachy in enumerate(y) if condition[indexy]==1],
                        mode = 'markers',marker = dict(color = 'yellow')))
fig.show()

Это даст вам:

enter image description here

То, что мы хотел, я верю.


Для преобразования в list из столбца DataFrame рекомендуем следующее: получить список из pandas столбца данных .

...