答案嘛,就是自己画legend啊,你看看legend函数,还不是些简单的代码在画,自己画即可。不要被这些条条框框给套住。
从ggplot2拿legend 为了突破你的想像力,在此处甚至于我要给你个例子,用ggplot2来生成个legend,放在base plot上去。
自己画legend,有何不可?!如果base有现成的函数画图,而你只熟悉ggplot2,你甚至于可以互搞。而互搞,当然要借助于ggplotify包:《ggplotify简史》。
col = colorspace::rainbow_hcl(3) names(col) = unique(iris$Species) library(ggplotify) color = col[iris$Species] p = as.ggplot(~plot(iris$Sepal.Length, iris$Sepal.Width, col=color, pch=15)) library(ggplot2) p2 = ggplot(iris, aes(Sepal.Length, Sepal.Width, color=Species)) + geom_point() + scale_color_manual(values=col, name="") legend = cowplot::get_legend(p2) p + ggimage::geom_subview(x=.7, y=.6, subview=legend) 这里用base plot画了一个图,又用ggplot2画了一个,用cowplot把legend抽出来,然后再用我的另一个包ggimage进行图上嵌图,完事。ggimage实例可以参考这篇《shit,拟合的残差这么大!》。
用ggplot2画legend 上面这例子是不是还不过瘾,因为啊我还是用ggplot2给重新画了一遍,如果你这么看,那么你的脑洞不够大,画是画了,但不一定要画一样的图,比如说有现成的base函数画复杂的图,而你不会用ggplot2画,但不妨碍你画个简单的图,但这简单的图中的图例可以切出来使用啊。
呼应我上面讲到的,图例自己徒手画,我们用ggplot2来来徒手一下。画出下面这个图例:
p2 <- ggplot() + annotate("point", x=1,y=1:3,shape=15, color=col) + annotate("text", x=1.01, y=1:3, label=names(col), hjust=0) + xlim(0.99, 1.2) + ylim(0, 4) + theme_void() 对着代码看,不应该有什么问题,打了三个点,再打了三个相应的文本。然后再让我们把这图当做图例,嵌套到base plot上去。
p + ggimage::geom_subview(x=.
Thomas Lin Pedersen简直是个天才,最近patchwork
动作很大,看到我都准备转投它的怀抱,把旧爱cowplot
给扔了。
我们知道patchwork
一出来,就推出+
号来拼图,最近又搞出了|
和/
两个操作符。让整个拼图看起来很舒服。
先来画几张图:
library(ggplot2)
p1 <- ggplot(mtcars) +
geom_point(aes(mpg, disp)) +
ggtitle('图一')
p2 <- ggplot(mtcars) +
geom_boxplot(aes(gear, disp, group = gear)) +
ggtitle('图二')
p3 <- ggplot(mtcars) +
geom_point(aes(hp, wt, colour = mpg)) +
ggtitle('图三')
p4 <- ggplot(mtcars) +
geom_bar(aes(gear)) +
facet_wrap(~cyl) +
ggtitle('图四')
今天讲一个小技巧,首先数据还是得有,很简单地生成一些随机数:
set.seed(2019-10-23)
d <- data.frame(val=abs(rnorm(20)),
type=rep(c('A', 'B'), 10))
20个数长这样子:
val type
1 0.04625141 A
2 0.28000082 B
3 0.25317063 A
4 0.96411077 B
5 0.49222664 A
6 0.69874551 B
7 0.82134409 A
8 0.70966741 B
9 1.56752284 A
10 1.12881681 B
11 0.82488089 A
12 0.19897743 B
13 0.76739568 A
14 0.70597703 B
15 0.24332380 A
16 0.55423292 B
17 2.49008811 A
18 1.35153628 B
19 2.13711738 A
20 0.92299795 B
upsetplot大家见得多,首先来个富集分析的实例:
library(DOSE)
data(geneList)
de <- names(geneList)[abs(geneList) > 2]
edo <- enrichDGN(de)
library(enrichplot)
upsetplot(edo)
《基佬的屁股和科学家的屎,之间的共同点是…!》这篇推文发表之后,发现大家对屎尿屁还是蛮有兴趣的,画屎除了展示的emojifont包之外,也提到了ggimage包,其实用ggimage包更有趣!这里也演示一下,一起来玩屎,看看自己到底是搅屎棍还是化粪池!玩屎玩出花来。
先来一张线性拟合的图:
set.seed(123)
iris2 <- iris[sample(1:nrow(iris), 30), ]
model <- lm(Petal.Length ~ Sepal.Length, data = iris2)
iris2$fitted <- predict(model)
iris3 <- iris2[abs(iris2$Petal.Length-iris2$fitted) > 0.5,]
p <- ggplot(iris2, aes(x = Sepal.Length, y = Petal.Length)) +
geom_point() +
geom_linerange(aes(ymin = fitted, ymax = Petal.Length),
data=iris3, colour = "purple") +
geom_abline(intercept = model$coefficients[1],
slope = model$coefficients[2])
p
在《ggplotify - version 0.0.4》一文中,有粉丝说想要支持Gviz包,画图包如果输出的是对象,那么我们可以写方法针对这个对象,然而Gviz的输出,却是list,显然这个方法走不通。
上次推送的《geom_bgimage》,竟然有人问说用ggplot2怎么搞。明明我的例子就是了,虽然用的是ggtree的例子,但与ggplot2何异?
require(ggplot2)
require(ggimage)
d = data.frame(x=LETTERS[1:3], y = 1:3)
d$y2 = rev(cumsum(rev(d$y)))
p = ggplot(d, aes(x=1, y, fill=x)) + geom_col(color='white') +
geom_bgimage("img/blackboard.jpg") + theme_void() +
coord_polar("y") + theme(legend.position='none') +
geom_text(aes(y = y2 - y/2, label=x),family='xkcd', size=8) +
xlim(-1, NA) + scale_fill_viridis_d()