如何在R中叠加散点图?

Posted

技术标签:

【中文标题】如何在R中叠加散点图?【英文标题】:How to overlay scatterplots in R? 【发布时间】:2013-10-07 21:27:28 【问题描述】:

如果我有三组数据:

a1= rnorm(10)
a2= rnorm(10)
a3= rnorm(10)

而不是使用以下方法并排查看:

par(mfrow=c(1,3))
plot(a1)
plot(a2)
plot(a3)

如何在同一个图上获得所有这些点?

【问题讨论】:

在基本图形中,您可以使用 pointslines 等函数将内容添加到现有绘图中,而不是再次调用 plot。 (请注意,这在 ?plot 的最后一个示例中得到了演示。) 【参考方案1】:

只需使用points 函数:

plot(a1)
points(a2, col=2)
points(a3, col=3)

这相当于:

plot(1:length(a1), a1)
points(1:length(a2), a2, col=2)
points(1:length(a3), a3, col=3)

如果向量的长度不相等,则应指定 x 轴限制:

plot(a1, xlim=c(1, max(length(a1), length(a2), length(a3))))

【讨论】:

为了满足他们对如何处理不同长度向量的额外查询,这需要从“仅使用”类型的答案进行修改。 @AnandaMahto OP 解决方案实际上与问题不匹配 - 他们已经交换了 x 和 y 轴。 我同意这个问题的措辞不是很好。我认为 OP 有点将 SO 用作个人 wiki,并没有真正考虑清楚他们想问什么 :)【参考方案2】:
# To overlay scatterplots in R

# import the required libraries
library(ggplot2)
library(reshape2)

# assign data
a1=rnorm(10)
a2=rnorm(10)
a3=rnorm(10)

# create a dataframe from combined data
# and set count to however many points are in each dataset
df = data.frame(a1, a2, a3, count = c(1:10))

# melt the dataframe
df.m = melt(df, id.vars ="count", measure.vars = c("a1","a2","a3"))

# take a look at what melt() does to get an idea of what is going on
df.m

# plot out the melted dataframe using ggplot
ggplot(df.m, aes(count, value, colour = variable)) + geom_point() + ylim(-3,3)

# swapping the axis
ggplot(df.m, aes(value, count, colour = variable)) + geom_point() + xlim(-3,3)

a1a3 大小相等时,不能将data.frame 放入相同的列中,作为melt 的输入。解决方案是简单地使用list:

a1 = rnorm(10)
a2 = rnorm(25)
a3 = rnorm(17)
a_list = list(a1, a2, a3)
a_df = do.call("rbind", lapply(a_list, 
                                function(x) data.frame(value = x, 
                                                       count = seq_along(x))))
ID_options = LETTERS[seq_along(a_list)]
a_df$ID = rep(ID_options, sapply(a_list, length))
ggplot(a_df, aes(x = value, y = count, color = ID)) + geom_point()

【讨论】:

@PaulHiemstra 此图与plot(a1) 不同,x 和 y 轴已交换。【参考方案3】:

要增加答案的多样性,您还可以使用lattice。在这里,每组代码示例中的第二行代表交换的轴。

library(lattice)

## If you have already created the "df" 
##   data.frame from your example
xyplot(count ~ a1 + a2 + a3, data=df)
xyplot(a1 + a2 + a3 ~ count, data=df)

## Without first creating the "df" 
##   data.frame from your example    
xyplot(1:10 ~ a1 + a2 + a3)
xyplot(a1 + a2 + a3 ~ 1:10)

如果您使用长度不等的向量,您可以从this answer I shared about cbinding vectors of unequal lengths 加载函数,然后使用我提到的第一种方法。 更新:请参阅 https://gist.github.com/mrdwab/6789277 了解该函数的最新版本。

例子:

a1 = rnorm(10)
a2 = rnorm(25)
a3 = rnorm(17)

library(lattice)
library(devtools)
## source_gist is not working properly unless you provide 
##   the full URL to the "raw" file
source_gist("https://gist.github.com/mrdwab/6789277/raw/9bd7d5931389ec475c49c1918d26d9899796a5d0/Cbind.R")

newdf <- Cbind(a1, a2, a3)
xyplot(a1 + a2 + a3 ~ sequence(nrow(newdf)), data=newdf)
xyplot(sequence(nrow(newdf)) ~ a1 + a2 + a3, data=newdf)

这是一个对默认颜色进行了一些调整的示例图:

xyplot(sequence(nrow(newdf)) ~ a1 + a2 + a3, data=newdf, 
       pch = 21, fill = c("black", "red", "green"), cex = 1)

【讨论】:

以上是关于如何在R中叠加散点图?的主要内容,如果未能解决你的问题,请参考以下文章

【R语言】--- 散点图

如何将数据椭圆叠加在 ggplot2 散点图上?

如何用R画折线图,散点图,平滑曲线图

R语言可视化散点图(scatter plot)并在散点图中叠加回归曲线叠加lowess拟合曲线(linear and lowess fit lines)使用plotlineabline函数

R语言barplot柱状图+散点图+误差棒

用ggplot2画箱线图叠加图层后变成一个很奇怪的样子,求救求救?