【问题标题】:how to color data points based on some rules in matplotlib如何根据 matplotlib 中的一些规则为数据点着色
【发布时间】:2015-09-23 23:14:41
【问题描述】:

我有一个信号,我想用离信号平均值太远的红点着色。例如:

k=[12,11,12,12,20,10,12,0,12,10,11]
x2=np.arange(1,12,1)
plt.scatter(x2,k, label="signal")
plt.show()

我想将数据点 20 和 0 涂成红色,并给它们一个特殊的标签,例如“警告”。 我读了matplotlib: how to change data points color based on some variable,但我不确定如何将它应用到我的案例中

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    如果你想要不同的标签,你需要不同的情节。
    根据您的公式过滤数据。
    在这种情况下,我取的值与平均值相差超过 1.5 个标准差。如果您不知道,在numpy 中,您可以使用布尔掩码来索引数组,并且只使用掩码为True 的元素。您还可以使用补码运算符~ 轻松翻转掩码。

    import matplotlib.pyplot as plt
    import numpy as np
    
    k=np.array([12,11,12,12,20,10,12,0,12,10,11])
    x2=np.arange(1,12,1)
    
    # find out which parameters are more than 1.5*std away from mean
    warning = np.abs(k-np.mean(k)) > 1.5*np.std(k)
    
    # enable drawing of multiple graphs on one plot
    plt.hold(True)
    
    # draw some lines behind the scatter plots (using zorder)
    plt.plot(x2, k, c='black', zorder=-1)
    
    # scatter valid (not warning) points in blue (c='b')
    plt.scatter(x2[~warning], k[~warning], label='signal', c='b')
    
    # scatter warning points in red (c='r')
    plt.scatter(x2[warning], k[warning], label='warning', c='r')
    
    # draw the legend
    plt.legend()
    
    # show the figure
    plt.show()
    

    这就是你得到的:

    【讨论】:

    • swendel,如果我想使用绘图而不是散点图怎么办?但仍希望警告点为红色?
    • 好吧,在这种情况下,最简单的解决方案是稍微作弊,并在两个散点图之前添加一个额外的图。 可以在一个绘图中使用不同颜色的标记,但正确获取图例可能并不容易。您可能可以创建一个配色方案并绘制并注释它,但由于简单,我更喜欢这种方式。一旦你想要逐渐改变颜色来表示严重程度,colorschme 事情可能会更好。
    • 我有一个小问题,假设某些条目带有 nan;考虑到这些 nan,我如何计算平均值?
    • @user3841581 使用np.nanmean。还有np.nanstd;)
    【解决方案2】:

    如果您只想要颜色,请尝试:

    import numpy as np
    import matplotlib.pyplot as plt
    
    k=[12,11,12,12,20,10,12,0,12,10,11]
    x2=np.arange(1,12,1)
    
    # Calculate an outlier limit (I chose 2 Standard deviations from the mean)
    k_bar = np.mean(k)
    outlier_limit = 2*np.std(k)
    # Generate a colour vector
    kcolors = ['red' if abs(value - k_bar) > outlier_limit else 'yellow' for value in k]
    
    #Plot using the colour vector
    plt.scatter(x2,k, label="signal", c = kcolors)
    plt.show()
    

    【讨论】:

    • 这只会创建颜色矢量。它不会将实际颜色应用于绘图。
    • 我删除了我的反对票。我认为这并不特别苛刻,因为答案实际上并没有回答问题,而且原始代码甚至不是有效的 Python。现在好了。
    • 公平评论。我在没有编辑器的情况下写作!
    猜你喜欢
    • 1970-01-01
    • 2016-11-20
    • 2017-07-25
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-09
    • 2016-01-17
    • 2020-12-15
    相关资源
    最近更新 更多