Условное форматирование сюжетных маркеров рассеяния - PullRequest
0 голосов
/ 30 апреля 2019

Проблема:
У меня есть набор данных с парами значений x и y, плюс значения lower_limit и upper_limit для y.

Я хочу построить x против y на графике рассеивания plot.ly, и раскрасить маркер зеленым, если lower_limityupper_limit, иначе красным .

Я знаю, что могу использовать 2 трассировки или добавить столбец color в DataFrame.Однако я хотел бы создать эти цвета на лету и использовать только одну трассировку.

Пример:
Рассмотрим этот набор данных:

   x   y  lower_limit  upper_limit
0  1  13           10           15
1  2  13           15           20
2  3  17           15           20

Первый маркер (x = 1, y = 13) должен быть зеленым, потому что lower_limityupper_limit (10 ≤ 13 ≤ 15), как и третий.
Однаковторой должен быть красным, потому что y <<code>lower_limit.

Затем я хочу создать этот график: enter image description here


MWE:

import pandas as pd
import plotly.graph_objs as go
import plotly.plotly as py
import plotly.offline as po

data = [
    [1, 13, 10, 15],
    [2, 13, 15, 20],
    [3, 17, 15, 20]
]

df = pd.DataFrame(
    data,
    columns=['x', 'y', 'lower_limit', 'upper_limit']
)

trace = go.Scatter(
    x=df['x'],
    y=df['y'],
    mode='markers',
    marker=dict(
        size=42,
        # I want the color to be green if 
        # lower_limit ≤ y ≤ upper_limit
        # else red
        color='green',
    )
)

po.plot([trace])

1 Ответ

3 голосов
/ 01 мая 2019

Я бы предложил создать новый массив, в котором будут храниться значения цветов. Ниже приведен пример, в котором используются np.where и np.logical_and для формирования вашего условного сравнения. Пожалуйста, дайте мне знать, подходит ли это для вашей проблемы!

import plotly.offline as py
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot, plot
from plotly import tools
import pandas as pd
import numpy
init_notebook_mode(connected=True)
data = [
    [1, 13, 10, 15],
    [2, 13, 15, 20],
    [3, 17, 15, 20]
]

df = pd.DataFrame(
    data,
    columns=['x', 'y', 'lower_limit', 'upper_limit']
)

#df['color'] = np.where(np.logical_and(df['lower_limit'] >= df['y'], df['y']  <= df['upper_limit']), 'green', 'red')

trace = go.Scatter(
    x=df['x'],
    y=df['y'],
    mode='markers',
    marker=dict(
        size=42,
        # I want the color to be green if 
        # lower_limit ≤ y ≤ upper_limit
        # else red
        color=np.where(np.logical_and(df['lower_limit'] >= df['y'], df['y']  <= df['upper_limit']), 'green', 'red'),
    )
)

iplot([trace])

Ссылка:

  1. Панды: np.where с несколькими условиями на фреймах данных

  2. Панды: троичный условный оператор для установки значения в DataFrame

...