【问题标题】:Two colour scatter plot in R or in pythonR或python中的两种颜色散点图
【发布时间】:2012-05-16 12:35:49
【问题描述】:

我有一个三列和 n 行的数据集。第 1 列包含名称、第 2 列 value1 和第 3 列 value2 (rank2)。

我想绘制一个散点图,其中显示名称的异常值。

我使用的R 命令是:

tiff('scatterplot.tiff')
data<-read.table("scatterplot_data", header=T)
attach(data)
reg1<-lm(A~B)
plot(A,B,col="red")
abline(reg1)
outliers<-data[which(2^(data[,2]-data[,3]) >= 4 | 2^(data[,2]-data[,3]) <=0.25),]

text(outliers[,2], outliers[,3],labels=outliers[,1],cex=0.50)

dev.off()

我得到这样的数字:

我想要的是下半部分的标签应该是一种颜色,上半部分的标签应该是另一种颜色,分别是绿色和红色。

对命令有什么建议或调整吗?

【问题讨论】:

  • 嗨,Angelo,您能解释一下您在这里使用的识别异常值的公式吗?

标签: python r scatter-plot


【解决方案1】:

您已经有了一个令您满意的合乎逻辑的测试。只需在颜色规范中将其用于文本:

     text(outliers[,2], outliers[,3],labels=outliers[,1],cex=0.50, 
         col=c("blue", "green")[ 
                which(2^(data[,2]-data[,3]) >= 4 ,  2^(data[,2]-data[,3]) <=0.25)] )

它当然未经测试,因为您没有提供测试用例,但我的理由是 which() 函数应该返回 1 表示差异 >= 4,返回 2 表示差异

【讨论】:

    【解决方案2】:

    使用 python、matplotlib (pylab) 进行绘图,使用scipynumpy 拟合数据。 numpy 的诀窍是创建一个索引或 mask 来过滤掉你想要的结果。

    编辑:想要选择性地为顶部和底部异常值着色?这是我们创建的两个掩码的简单组合:

    import scipy as sci
    import numpy as np
    import pylab as plt
    
    # Create some data
    N = 1000
    X = np.random.normal(5,1,size=N)
    Y = X + np.random.normal(0,5.5,size=N)/np.random.normal(5,.1)
    NAMES = ["foo"]*1000 # Customize names here
    
    # Fit a polynomial
    (a,b)=sci.polyfit(X,Y,1)
    
    # Find all points above the line
    idx = (X*a + b) < Y
    
    # Scatter according to that index
    plt.scatter(X[idx],Y[idx], color='r')
    plt.scatter(X[~idx],Y[~idx], color='g')
    
    # Find top 10 outliers
    err = ((X*a+b) - Y) ** 2
    idx_L = np.argsort(err)[-10:]
    for i in idx_L:
        plt.text(X[i], Y[i], NAMES[i])
    
    # Color the outliers purple or black
    top = idx_L[idx[idx_L]]
    bot = idx_L[~idx[idx_L]]
    
    plt.scatter(X[top],Y[top], color='purple')
    plt.scatter(X[bot],Y[bot], color='black')
    
    XF = np.linspace(0,10,1000)
    plt.plot(XF, XF*a + b, 'k--') 
    plt.axis('tight')
    plt.show()
    

    【讨论】:

    • 很好的答案,但我只需要为异常值中的点着色。 :)
    • @Angelo 我修改了代码,使顶部和底部异常值的颜色不同。我希望这能填补空白,如果您有不明白的地方,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多