ggplot使用中的一些问题

在循环或者子函数中只显示最后一个ggplot图像的问题解决

使用print(ggplot)例如:

for (i in 1:10) {
  figure<-ggplot(dataframe,aes(x=x,y=y))+points()
  print(figure)
}

更改ggplot中刻面图的标签

该部分参考:
https://blog.csdn.net/tanzuozhev/article/details/51112177

修改分页的标签外观

figure + facet_grid(sex ~ day) +
    theme(strip.text.x = element_text(size=8, angle=75),
          strip.text.y = element_text(size=12, face="bold"),
          strip.background = element_rect(colour="red", fill="#CCCCFF"))

在这里插入图片描述

修改分页标签文字

labels <- c(Female = "Women", Male = "Men")
sp + facet_grid(. ~ sex, labeller=labeller(sex = labels))

在这里插入图片描述

labeller

labeller() 通过输入一个方法, 对字符串进行该方法处理的,重新返回字符串.

# Reverse each strings in a character vector
reverse <- function(strings) {
    strings <- strsplit(strings, "")
    vapply(strings, function(x) {
        paste(rev(x), collapse = "")
    }, FUN.VALUE = character(1))
}
 
sp + facet_grid(. ~ sex, labeller=labeller(sex = reverse))

在这里插入图片描述

刻面图中释放坐标轴

# scales="free_y", y轴自由设置
hp + facet_grid(sex ~ smoker, scales="free_y")

对于x轴也是一样的

对ggplot的图例进行修改

https://blog.csdn.net/zx403413599/article/details/48581713

将其他作图系统转换为ggplot对象

使用ggplotify中的as.ggplot()可以将其他图片转换为ggplot对象,例如:

library(pacman)
p_load(ggplotify)
p4 <- as.ggplot(~boxplot(mtcars$wt))

多图形排版方法1

加载patchwork包之后,两个ggplot图形直接的加号连接可以实现并排排列:

library(pacman)
p_load(patchwork) 
p1 <- ggplot(mtcars, aes(x=hp, y=wt, colour = mpg)) + 
  geom_point()

p2 <- ggplot(mtcars, aes(x=gear)) + 
  geom_bar() +
  facet_wrap(~cyl)

p1 + p2+ p1

在这里插入图片描述
使用cowplot中的plot_grid()可以做出更加紧凑的排版:

library(pacman)
p_load(cowplot)
p1 <- ggplot(mtcars, aes(x=hp, y=wt, colour = mpg)) + 
  geom_point()

p2 <- ggplot(mtcars, aes(x=gear)) + 
  geom_bar() +
  facet_wrap(~cyl)

p3 <- as.ggplot(~barplot(mtcars$wt))

p4 <- as.ggplot(~boxplot(mtcars$wt))

plot_grid(p1, p2, p3, p4,p1,  labels=LETTERS[1:4])

在这里插入图片描述

多图形排版方法2

require(ggplot2)
require(grid)
##只对ggplot有用

chart1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point()
chart2 <- ggplot(diamonds, aes(carat, depth, colour = color)) + geom_point()
chart3<- ggplot(diamonds, aes(carat, depth, colour = color)) + geom_point() + facet_grid(.~color) 

grid.newpage()  ###新建图表版面
pushViewport(viewport(layout = grid.layout(2,2))) ####将版面分成2*2矩阵
vplayout <- function(x,y){viewport(layout.pos.row = x, layout.pos.col = y)}  
###定义图表的布局规则,也就是指定画布的行显示图表的X轴,列显示图表的Y轴。

print(chart3, vp = vplayout(1,1:2))   ###将(1,1)和(1,2)的位置画图chart3
print(chart2, vp = vplayout(2,1))     ###将(2,1)的位置画图chart2          
print(chart1 , vp = vplayout(2,2))    ###将(2,2)的位置画图chart1

在这里插入图片描述

多图形排版方法3(最强大)

customLayout包可以兼容所有作图系统的排版,安装方法:

# 第一种方法
install.packages("customLayout")

# 第二种方法
library(devtools)
install_github("zzawadz/customLayout")

实例:

library(customLayout)
library(magrittr)
#############
lay<-lay_new(
  mat=matrix(1:4,ncol=2),
  widths=c(3,2),
  heights = c(2,1)
)
lay_show(lay)

lay2 <- lay_new(
  matrix(1:4, nc = 2),
  widths = c(3, 5),
  heights = c(2, 4))
lay_show(lay2)
#########列向拼接
cl = lay_bind_col(lay, lay2, widths = c(3, 1))
lay_show(cl)
#########行拼接
lay3 <- lay_new(matrix(1:2))
lay4 <- lay_bind_row(cl, lay3, heights = c(5, 2))
lay_show(lay4)
########嵌入
slay <- lay_split_field(lay, lay2, field = 4)
lay_show(slay)
########

####important
#######将图形嵌入所分区块中
par(mar = c(1, 2, 2, 1),col.axis="red")#调整图像边界留白
lay  <- lay_new(
  matrix(1:4, ncol = 2),
  widths = c(3, 2),
  heights = c(2, 1))
lay2 <- lay_new(matrix(1:3))
cl   <- lay_bind_col(lay, lay2, widths = c(3, 1))
lay_show(cl)

lay_set(cl) # initialize drawing areaset.seed(123)
plot(1:100 + rnorm(100))
plot(rnorm(100), type = "l")
hist(rnorm(500))
acf(rnorm(100))
pie(c(3, 4, 6), col = 2:4)
pie(c(3, 2, 7), col = 2:4 + 3)
pie(c(5, 4, 2), col = 2:4 + 6)
par(mfrow = c(1, 1))#关闭分区
##########
##########
#########将ggplot嵌入所分区块
library(ggplot2)
library(gridExtra)

lay  <- lay_new( matrix(1:2, ncol = 1))
lay2 <- lay_new(matrix(1:3))
cl   <- lay_bind_col(lay, lay2, widths = c(3, 1))
cuts <- sort(unique(diamonds[["cut"]]),decreasing = TRUE)

make_cut_plot <- function(cut) {
  dd <- diamonds[diamonds[["cut"]] == cut, ]
  ggplot(dd) +
    geom_point(aes(carat, price)) +
    facet_wrap("cut")
}

plots <- lapply(cuts, make_cut_plot)
lay_grid(plots, cl)
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
译本序, 每当我们看到一个新的软件,第一反应会是:为什么又要发明一个新软件?ggplot2是R世界里相对还比较年轻的一个包,在它之前,官方R已经有自己的基础图形系统(graphics包)和网格图形系统(grid包),并且Deepayan Sarkar也开发了lattice包,看起来R的世界对图形的支持已经足够强大了。那么我们不禁要问,为什么还要发明一套新的系统?, 设计理念, 打个比方,想想我们小时候怎样学文的。最开始的时候我们要识字,不认识字就没法阅读和写作,但我们并不是一直按照一个个汉字学习的,而是通过句子和具体的场景故事学习的。为什么不在小学时背六年字典呢?那样可能认识所有的汉字。原因很简单,光有单字,我们不会说话,也无法阅读和写作。缺的是什么?答案是对文字的组织能力,或者说语法。, R的基础图形系统基本上是一个“纸笔模型”,即:一块画布摆在面前,你可以在这里画几个点,在那里画几条线,指哪儿画哪儿。后来lattice包的出现稍微改善了这种情况,你可以说,我要画散点图或直方图,并且按照某个分类变量给图的元素上色,此时数据才在画图扮演了一定的心角色,我们不用去想具体这个点要用什么颜色(颜色会根据变量自动生成)。然而,lattice继承了R语言的一个糟糕特征,就是参数设置铺天盖地,足以让人窒息,光是一份xyplot()函数的帮助文档,恐怕就够我们消磨一天时间了,更重要的是,lattice仍然面向特定的统计图形,像基础图形系统一样,有直方图、箱线图、条形图等等,它没有一套可以让数据分析者说话的语法。, 那么数据分析者是怎样说话的呢?他们从来不会说这条线用#FE09BE颜色,那个点用三角形状,他们只会说,把图的线用数据的职业类型变量上色,或图点的形状对应性别变量。有时候他们画了一幅散点图,但马上他们发现这幅图太拥挤,最好是能具体看一下里面不同收入阶层的特征,所以他们会说,把这幅图拆成七幅小图,每幅图对应一个收入阶层。然后发现散点图的趋势不明显,最好加上回归直线,看看回归模型反映的趋势是什么,或者发现图离群点太多,最好做一下对数变换,减少大数值对图形的主导性。, 从始至终,数据分析者都在数据层面上思考问题,而不是拿着水彩笔和调色板在那里一笔一划作图,而计算机程序员则倾向于画点画线。Leland Wilkinson的著作在理论上改善了这种状况,他提出了一套图形语法,让我们在考虑如何构建一幅图形的时候不再陷在具体的图形元素里面,而是把图形拆分为一些互相独立并且可以自由组合的成分。这套语法提出来之后他自己也做了一套软件,但显然这套软件没有被广泛采用;幸运的是,Hadley Wickham在R语言把这套想法巧妙地实现了。, 为了说明这种语法的想法,我们考虑图形的一个成分:坐标系。常见的坐标系有两种:笛卡尔坐标系和极坐标系。在语法,它们属于一个成分,可自由拆卸替换。笛卡尔坐标系下的条形图实际上可以对应极坐标系下的饼图,因为条形图的高可以对应饼图的角度,本质上没什么区别。因此在ggplot2,从一幅条形图过渡到饼图,只需要加极少量的代码,把坐标系换一下就可以了。如果我们用纸笔模型,则可以想象,这完全是不同的两幅图,一幅图里面要画的是矩形,另一幅图要画扇形。, 更多的细节在本书会介绍,这里我们只是简略说明用语法画图对用纸笔画图来说在思维上的优越性;前者是说话,后者是说字。, 发展历程, ggplot2是Hadley在爱荷华州立大学博士期间的作品,也是他博士论文的主题之一,实际上ggplot2还有个前身ggplot,但后来废弃了,某种程度上这也是Hadley写软件的特征,熟悉他的人就知道这不是他第一个“2”版本的包了(还有reshape2)。带2的包和原来的包在语法上会有很大的改动,基本上不兼容。尽管如此,他的R代码风格在R社区可谓独树一帜,尤其是他的代码结构很好,可读性很高,ggplot2是R代码抽象的一个杰作。读者若感兴趣,可以在GitHub网站上浏览他的包:https://github.com/hadley。在用法方面,ggplot2也开创了一种奇特而绝妙的语法,那就是加号:一幅图形从背后的设计来说,是若干图形语法的叠加,从外在的代码来看,也是若干R对象的相加。这一点精妙尽管只是ggplot2系统的很小一部分,但我个人认为没有任何程序语言可比拟,它对作为泛型函数的加号的扩展只能用两个字形容:绝了。, 至2013年2月26日,ggplot2的邮件列表(http://groups.google.com/group/ggplot2 )订阅成员已达3394人,邮件总数为15185封,已经成为一个丰富、活跃的用户社区。未来ggplot2的发展也将越来越依赖于用户的贡献,这也是很多开源软件最终的走向。, 关于版本更新, 原书面

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值