用ggplot将多个数据集绘在一个图上以及双标轴问题
在绘图时有时需要将不同的数据集的数据绘制在同一个图上。举个例子,例如医学上的把患者的AST、ALT、病毒载量等不同的指标绘制在一个图上来观察这些指标变化趋势的相关趋势。还有就是在图上标记另外的文字等。下面是我检索到的一些方法,供大家探讨。
一
自己测试的可用的方法,而且简单的解决了我自己的问题。以下看代码
library(ggplot2)
x <- c("a", "b","c", "a", "b", "c", "a")
y <- c(1,4,5,2,3,4,1)
d <- data.frame(x = x, y = y)
counts <- data.frame(x = c("a", "b", "c"), n = c(3, 2, 2))
ggplot() + geom_boxplot(data = d, aes(x = x, y = y)) +
geom_text(data = counts, aes(x = x, y = 6, label = n))
以上主要是解决我自己的问题,我想在箱须图的顶部标记样本数。目前尚未找到ggplot2内置的函数可以做到这一点。因此自己想到的解决办法。
这个代码相对比较容易理解。有点类似于base包中的作图逻辑就是一层一层的加盖上去,但是更为易用。整个图的scale是结合了两个不同的图的整体需求考虑的。读者可以尝试调大geom_text()
中的y值,坐标轴会自动扩展。
二
这个是网上学来的方法很遗憾我没能全部理解,所以没能重复出来结果。为了尊重原作者下面是我找到的原文地址https://codeday.me/bug/20171228/112335.html
有兴趣的大家可以去看看。
三
如果我们想在同一张画布上展示的图的数值范围差别很大该怎么办?
如果只是想看一下变化趋势的相关性,例如某一指标升高时,另外一个指标如何变化,那就可以将两个数据集的y值标准化一下,不显示真正数值即可。如果还想看真实数值那可能就需要借助双坐标轴图来完成。
下面是代码
#a data set for example
Date <- seq(from=as.Date("2015-01-01"), to=as.Date("2015-12-01"), by="month")
Consumers <- c(100,80,120,153,200,188,220,322,300,321,282,304)
Amount <- c(1000,840,1458,1844,2045,2000,2548,5081,5000,5200,4800,4971)
df1 <- data.frame(Date=Date, Consumers=Consumers,Amount=Amount)
library(ggplot2)
p <- ggplot(df1, aes(x = Date))
p <- p + geom_line(aes(y = Consumers, color = "Consumers"))
p <- p + geom_point(aes(y = Amount/20, color = "Amount"))
p <- p + scale_y_continuous(sec.axis = sec_axis(~. *20, name = "Amount"))
# notice the first augment, trans in sec_axis
p <- p + scale_color_manual(values = c("red", "blue"))
p <- p + theme(axis.title.y = element_text(size = 18))
p
(以上代码也是网上找到的,但是当时没有记录网址,对原作者说一声抱歉)
以上数据是时间序列数据,展示的就是两种不同变量的变化趋势。值得注意的是代码中对y值的变化处理,包括y = Amount/20
和sec_axis(~. *20, name = "Amount")
这两个设定。
sec_axis(trans = NULL, name = waiver(), breaks = waiver(),labels = waiver())
变量的解释如下:
trans A transformation formula
name The name of the secondary axis
breaks One of:
NULL for no breaks
waiver() for the default breaks computed by the transformation object
A numeric vector of positions
A function that takes the limits as input and returns breaks as output
labels One of:
NULL for no labels
waiver() for the default labels computed by the transformation object
A character vector giving labels (must be same length as breaks)
A function that takes the breaks as input and returns labels as output
四
我只是R知识的搬运工,我还不会自己生产R相关内容。感谢大神们的工作和热心的分享。
R基础很重要,但是基于问题的总结也是很实用,也能反过来促进我们理解R基础。我一直是基于这样一个思路写我的简书文章,激励一下我自己继续坚持下去。
网友评论