【问题标题】:Python Pandas/Matplot - Annotating values above and below a linePython Pandas/Matplotlib - 注释线上和线下的值
【发布时间】:2018-01-30 10:14:33
【问题描述】:

我有一个值数据框,我用它来绘制带有置信区间的散点图/折线图:

数据框(sqlDF2)是这样的:

Statu   Total   count   Success   Pred   Upper95    Lower95      Upper99    Lower99
Org                             
A        391    391       38    0.35064  0.398903   0.302377    0.423034    0.278245
B        360    360       30    0.343464 0.393519   0.293408    0.418546    0.268381
C        271    271       29    0.319606 0.37626    0.262951    0.404587    0.234624
D        247    247       22    0.312089 0.371053   0.253125    0.400535    0.223643
...

我绘制图形的代码是:

y = sqlDf2['Success'].values
x = sqlDf2['Total'].values

up95 = (sqlDf2['Upper95'].values)*100
low95 = (sqlDf2['Lower95'].values)*100
up99 = (sqlDf2['Upper99'].values)*100
low99 = (sqlDf2['Lower99'].values)*100
middleLine = (sqlDf2['Pred'].values)*100

plt.figure(figsize=(15,8))
plt.ylim(0, 100)
plt.margins(x=0)

plt.scatter(x,y,marker='o',c='white',edgecolors = 'black', alpha=.5)
plt.plot(x,up95, 'red', linestyle=':', dashes=(1, 5), linewidth=1)
plt.plot(x,low95, 'red', linestyle=':', dashes=(1, 5), linewidth=1)
plt.plot(x,up99, 'red', linestyle=':', dashes=(1, 5), linewidth=1)
plt.plot(x,low99, 'red', linestyle=':', dashes=(1, 5), linewidth=1)
plt.plot(x,middleLine, 'red', linestyle='-', dashes=(1, 2), linewidth=1)

plt.show() 

图表如下所示:

我想要做的是用“Org”的值对高于和低于 99% 置信区间的值进行注释。有没有一种简单的方法可以计算出 Python 中两行上下的值?

谢谢

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    在您的 DataFrame 中,您将数据点的 y 值和行的 y 值放在一行中。因此,您可以为此使用np.where

    C = np.where(condition, A, B)
    

    如果条件为True,则设置A,如果条件为False,则设置B。如果您想检查 Upper99Lower99 行,您可以按如下方式实现:

    sqlDF2['Outside'] = np.where((sqlDf2['Success'] > sqlDf2['Upper99']*100) | (sqlDf2['Success']<sqlDf['Lower99']*100), True, False)
    

    如果数据点位于给定边界之外,这将产生一个包含True 的新列,如果它在边界内,则包含False

    【讨论】:

    • 嘿,谢谢。我得到了“|: 'float' 和 'int' 不支持的操作数类型”,但我认为可以通过将其中一列转换为 int 或 float 来解决此问题。非常感谢您的帮助! :)
    • 嗯,在修复浮动问题后得到一个“TypeError: unsupported operand type(s) for |: 'float' and 'bool''。有什么想法吗?
    • 用一些括号修复了它! sqlDf2['Outside'] = np.where((sqlDf2['Success'] > sqlDf2['Upper99']*100) | (sqlDf2['Success']
    • 我刚刚在答案中添加了括号以使其正常工作
    猜你喜欢
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2011-08-02
    • 2018-10-14
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多