【问题标题】:Conditional formatting of plotly scatterplot markers散点图标记的条件格式
【发布时间】:2019-09-19 10:40:19
【问题描述】:

问题:
我有一个包含xy 值对的数据集,以及ylower_limitupper_limit 值。

我想在 plot.ly 散点图中绘制xy,如果lower_limityupper_limit,则标记为绿色,否则为红色强>。

我知道我可以使用 2 个跟踪,或者在 DataFrame 中添加一个 color 列。但是,我想动态生成这些颜色并只使用一条轨迹。

示例:
考虑这个数据集:

   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 lower_limit.

然后我想生成这个图表:


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

【问题讨论】:

    标签: python colors plotly plotly-python


    【解决方案1】:

    我建议创建一个新的数组来存储颜色值,请在下面找到使用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

    【讨论】:

    • 感谢您的回答。但是,正如问题中所述,我希望 - 尽可能 - 不要在表格中添加一列。
    • 如果这样做,两种颜色(或n个条件)的图例都不会显示,你知道怎么做吗?
    猜你喜欢
    • 2013-05-22
    • 2021-10-10
    • 2020-02-20
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多