散点图标记的条件格式

时间:2019-04-30 18:05:09

标签: python colors plotly plotly-python

问题:
我有一个数据集,其中包含xy值对,以及lower_limit的{​​{1}}和upper_limit值。

我想在plot.ly散点图中绘制yx,如果ylower_limit≤{ {1}},否则为红色。

我知道我可以使用2条跟踪,或在DataFrame中添加一个y列。但是,我想即时生成这些颜色并仅使用一条迹线。

示例:
考虑以下数据集:

upper_limit

第一个标记(color = 1, x y lower_limit upper_limit 0 1 13 10 15 1 2 13 15 20 2 3 17 15 20 = 13)应该是绿色的,因为xylower_limit(10≤13≤ 15),就像第三个一样。
但是第二个应该是红色的,因为y <upper_limit

然后我要生成此图: enter image description here


MWE:

y

1 个答案:

答案 0 :(得分:3)

我建议创建一个存储颜色值的新数组,请在下面的示例中使用np.wherenp.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. Pandas: np.where with multiple conditions on dataframes

  2. Pandas: Ternary conditional operator for setting a value in a DataFrame