【问题标题】:R scatter plot get values under the curveR散点图获取曲线下的值
【发布时间】:2021-06-24 01:09:19
【问题描述】:

R 散点图并创建了三条曲线,我想要外两条线覆盖的值

建议我如何获得两条外部红线之间的值

使用的数据 test data

使用的代码

library("PerformanceAnalytics")


df=read.table("test",sep='\t', header=TRUE)
pdf('test.pdf',width=6,height=6)
smoothScatter(df$level2,df$level1,main = "data",xlab='level2',ylab='level1',nrpoints=Inf,xlim=c(0,1),ylim=c(0,1),pch=20,cex=0.5)
points(c(0,1),c(1,0),type='l',col='green',lty=2,lwd=2)
points(((1-p)^2)+0.03,(p^2)+0.03,type='l',col='red',lty=2,lwd=2)
points(((1-p)^2)-0.03,(p^2)-0.03,type='l',col='red',lty=2,lwd=2)
p=0:1000/1000
points((1-p)^2,p^2,type='l',col='red',lty=2,lwd=2)
legend(0.30, 1, c("Co", "data_observe"), 
       col = c("green", "red"), bg = "#FFFFFFAA", 
       lty = 2, lwd = 4, box.col = "#FFFFFF00")
dev.off()

谢谢

【问题讨论】:

  • 大胆用python标记R问题
  • @Pietro 我想用一些数据过滤器看到曲线值可以过滤,用 python
  • 我不知道如何整合这两种语言,但如果你有红线的封闭式公式,你可以为每个数据点计算 ylowyhigh使用数据点x 值对两条线的值,然后检查y 数据值是否介于这两者之间。
  • @Pietro 我试过但没能得到,你能用一些代码显示一下吗
  • 如果不尝试自动识别点,但可以交互方式,请尝试identify()

标签: python r plot scatter-plot


【解决方案1】:

这是一个自动过程,将每个点与中间和下面的红线进行比较。会有警告提示yvalu中的最后一个值为NaN,但可以忽略:

yvalm <- ((2 - sqrt(4 - 4 * (1 - df$level2)))/2)^2               # Middle Red Line
yvalu <- ((2 - sqrt(4 - 4 * (1 - df$level2 + .03)))/2)^2 + .03   # Upper Red Line
# Warning message:
# In sqrt(4 - 4 * (1 - df$level2 + 0.03)) : NaNs produced
yvall <- ((2 - sqrt(4 - 4 * (1 - df$level2 - .03)))/2)^2 - .03   # Lower Red Line
Within <- which(df$level1 > yvall & df$level1 < yvalm)
points(level1~level2, df[Within, ], cex=2, col="red")

该图显示了已识别的点。

现在列出要点:

df[Within, ]
#          data level1 level2
# 149  data2696 0.0813 0.4553
# 660  data3795 0.1393 0.3279
# 672  data3388 0.1789 0.3252
# 742   data536 0.1901 0.3140
# 1430 data1809 0.2750 0.1750
# 1455  data929 0.3220 0.1695
# 1722 data2306 0.4098 0.1230
# 1861  data362 0.4455 0.1000
# 2032  data559 0.5164 0.0574

@Pietro 建议的解决方案在 R 中也很简单:

library(sp)
middle <- cbind((1 - p)^2, p^2)
lower <- cbind(rev((1 - p)^2 - 0.03), rev((p^2) - 0.03))
poly <- rbind(middle, lower)
polygon(poly)
inside <- point.in.polygon(df$level2, df$level1, poly[, 1], poly[, 2])
df[inside==1, ]
#          data level1 level2
# 149  data2696 0.0813 0.4553
# 660  data3795 0.1393 0.3279
# 672  data3388 0.1789 0.3252
# 742   data536 0.1901 0.3140
# 1430 data1809 0.2750 0.1750
# 1455  data929 0.3220 0.1695
# 1722 data2306 0.4098 0.1230
# 1861  data362 0.4455 0.1000
# 2032  data559 0.5164 0.0574

【讨论】:

  • 谢谢,但问题在于我的真实数据点很多,需要很多时间
  • 我已经用不同的方法替换了原来的答案。
【解决方案2】:

这就是我的意思:

  1. 计算边界的闭合形式y=f(x),求解p
  2. 对于每个点,计算该x 值的边界值。
  3. 检查该点的y 值是否在计算的边界之间。
  4. 使用此结果构建一个颜色数组,每个点一个颜色。

大家一起:

import csv
import matplotlib.pyplot as plt
from pathlib import Path
import numpy as np


def limsup(x):
    alpha = 0.03
    return (1 - np.sqrt(x - alpha)) ** 2 + alpha


def liminf(x):
    alpha = -0.03
    return (1 - np.sqrt(x - alpha)) ** 2 + alpha


fig, ax = plt.subplots(1, 1)

data_name = "testdata.tsv"
data_path = Path(data_name)

l1, l2 = [], []
between = []

with data_path.open() as dp_f:
    data_tsv = csv.reader(dp_f, delimiter="\t")
    next(data_tsv)
    for row in data_tsv:
        l1val = float(row[1])
        l1.append(l1val)
        l2val = float(row[2])
        l2.append(l2val)

        # compute the values of the two boundary for this x value
        sup = limsup(l2val)
        inf = liminf(l2val)

        # if the y value is between the boundary, assing green
        if inf <= l1val <= sup:
            between.append("green")
        else:
            between.append("blue")

ax.scatter(l2, l1, c=between, marker=".", label="data")

p = np.linspace(0, 1, 100)

# just to check that the limsup/liminf are correct
# ax.plot((1 - p) ** 2, p ** 2)
# ax.plot((1 - p) ** 2 + 0.03, p ** 2 + 0.03, label="sup")
# ax.plot((1 - p) ** 2 - 0.03, p ** 2 - 0.03, label="inf")

ax.plot(p, np.fromiter((limsup(x) for x in p), dtype=float), label="limsup")
ax.plot(p, np.fromiter((liminf(x) for x in p), dtype=float), label="liminf")

ax.legend()
fig.tight_layout()
plt.show()

这会产生:

我不知道如何将其移植到 R,但一般推理应该很清楚。

干杯!

【讨论】:

  • 无需移植到 R 如何获取绿色值
猜你喜欢
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 2012-11-25
  • 2017-04-14
  • 2014-08-17
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多