在单个图表上使用ggplot绘制两个散点图。

15

请注意,我是R语言的初学者。我使用merge()方法合并了两个带有一个公共列的数据框,并获得了以下数据框:

 x   y1   y2
 1   3    5
 2   2    4
 1   2    2
 3   5    5
 ...

我想用ggplot绘制这样的数据框。我创建的是(使用geom_point文档):

ggplot(data = dat_c, aes(games, variance.x)) + 
     geom_point(aes(x = games, y = variance.x), legend=  TRUE,  xlab="X", ylab="Y", colour=alpha('red', 0.05)) + 
     geom_point(aes(x = games, y = variance.y), legend = TRUE, colour=alpha('blue', 0.05) )

它可以工作,NaN不会打扰我,因为我会收到被忽略的警告,这很好。 但是我有两个问题,而且我不确定如何解决:

  1. 我的实际图位于左下角,我想设置X和Y轴的最大值(以动态方式,例如使用数据中的最高值+100或类似方法)
  2. 图例未显示
  3. 坐标轴未描述

以下是其外观: enter image description here

2个回答

12

参见:

(这些是通过搜索 [r] ggplot melt 获得的结果,尽管您还可以通过 [r] ggplot legend 等方式获得...)

如果可以的话,获取一本 ggplot 书籍并从头开始阅读——不幸的是,草稿的PDF文件不再在线上提供。但是这本书值得投资。

  1. 实际上,您的绘图中有一些接近极端的 xy 值的点。之所以很难看到它们,是因为它们几乎是透明的(在白色背景上可能会更容易看到,即尝试在 ggplot 调用中添加 + theme_bw())。如果您想限制绘图范围,可以使用 xlimylim。(尝试对数据运行 summary 并查看最大值...)

  2. 绘制轴的最佳方法是遵循“融化”数据的 ggplot 习惯用法,将其转换为一个长格式数据集,其中一列用于类别(y1 vs y2),另一列用于值,如下所示:

  d <- data.frame(x=c(1,2,1,3),
                y1=c(3,2,2,5),
                y2=c(5,4,2,5))
  library(ggplot2) 
  library(reshape2) ## for melt()
  dm  <- melt(d,id.var=1)
  ggplot(data=dm,aes(x,value,colour=variable))+
  geom_point(alpha=0.2)+
  scale_colour_manual(values=c("red","blue"))+
  labs(x="games",y="variance")

(抱歉格式有点奇怪) 我将alpha值设置得稍高,否则在图中很难看到这些点。我认为默认颜色(偏红和蓝)还不错,但我使用了scale_colour_manual按照你的指定来获取它们。 enter image description here

  1. 我不确定你的意思。

非常感谢您的回答。最后一个问题只是关于X和Y轴标签的问题 - 您已经通过labs()方法解决了这个问题,而我之前不知道(我尝试了xlab和ylab)。 - mkk
没问题。如果您在ggplot对象中将其作为分离的项(而不是在geom_point()调用内部),使用+xlab("games")+ylab("variance")也可以正常工作。 - Ben Bolker
1
@BenBolker scale_colour_manual有一个名为value的参数吗? 在我看来,它应该是values,带有最后的“s”。 - Alessandro Jacopson

9
你应该将数据融化成长格式,然后将颜色美学映射到来自融化的数据框的变量列。类似这样:

dat <- data.frame(x = c(1,2,1,3), y1 = c(3,2,2,5), y2 = c(5,4,2,5))

dat.m <- melt(dat, id.vars = "x")

ggplot(dat.m, aes(x, value, colour = variable)) +
  geom_point() +
  scale_colour_manual(values = c("red", "blue"))

您可以使用xlim()ylim()手动设置限制。关于alpha的操作不太清楚,这个就由您自己决定了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接