ggplot2-设置坐标轴

本文更新地址:http://blog.csdn.net/tanzuozhev/article/details/51107583

本文在 http://www.cookbook-r.com/Graphs/Axes_(ggplot2)/ 的基础上加入了自己的理解

基本箱线图

library(ggplot2)

bp <- ggplot(PlantGrowth, aes(x=group, y=weight)) +
    geom_boxplot()
bp

反转 x轴 与 y轴

bp + coord_flip()

离散型数据的坐标轴

改变坐标轴中各项目的顺序 > 特别注意, 离散数据的坐标轴中数据做为 factor 变量处理,他的位置取决于 level的顺序

# 手动设置x轴的位置
bp + scale_x_discrete(limits=c("trt1","trt2","ctrl"))

# 逆转顺序
# 得到 factor 变量的 level
flevels <- levels(PlantGrowth$group)
flevels
## [1] "ctrl" "trt1" "trt2"
# 逆转了 level 的顺序
flevels <- rev(flevels)
flevels
## [1] "trt2" "trt1" "ctrl"
bp + scale_x_discrete(limits=flevels)

# 或者写到一行里面
bp + scale_x_discrete(limits = rev(levels(PlantGrowth$group)))

scale_x_discrete 可以设置离散型(discrete)数据, 中间的 x 表示处理x轴,如果是 fill 则可以修改填充颜色, color 修改边框颜色, shape 修改形状……

设置坐标轴的标签
# 将原有的 "ctrl", "trt1", "trt2" 修改为 "Control", "Treat 1", "Treat 2"
bp + scale_x_discrete(breaks=c("ctrl", "trt1", "trt2"),
                      labels=c("Control", "Treat 1", "Treat 2"))

# 隐藏
bp + scale_x_discrete(breaks=NULL)

# 也可以这样通过设置 theme 实现
bp + theme(axis.ticks = element_blank(), axis.text.x = element_blank())

连续型数据的坐标轴

设置坐标轴的范围和颠倒

# Make sure to include 0 in the y axis
bp + expand_limits(y=0) # y轴从0开始

# 设置y轴的范围
bp + expand_limits(y=c(0,8))

我们可以通过expand_limits设置坐标轴的范围, 但是如果 scale_y_continuous 被使用, 那么就会覆盖ylim的设置.

# 设置y轴的范围
bp + ylim(0, 8)

# 同样可以这样
bp + scale_y_continuous(limits=c(0, 8))

# 如果同时设置 scale_y_continuous 和 ylim那么ylim会被覆盖,首先执行scale_y_continuous
bp + scale_y_continuous(limits=c(0, 8))+
  ylim(0,10)
## Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.

如果 y 的范围使用上面的方法被截取, 那么这个范围以外的数据会被忽略,原始数据中的数据同样会被忽略,比如设置了ylim(5,8),那么小于5和大于8的原始数据同样会被忽略,当然散点图没有问题,但是箱线图会出错.

为了避免这个问题可以使用coord_cartesian来设置范围.

可以看下面的例子, 第一个出错了, 第二个使用了coord_cartesian得到了正确的绘图.

# These two do the same thing; all data points outside the graphing range are
# dropped, resulting in a misleading box plot
bp + ylim(5, 7.5)
## Warning: Removed 13 rows containing non-finite values (stat_boxplot).

# bp + scale_y_continuous(limits=c(5, 7.5))

# Using coord_cartesian "zooms" into the area
bp + coord_cartesian(ylim=c(5, 7.5))

# Specify tick marks directly
bp + coord_cartesian(ylim=c(5, 7.5)) + 
    scale_y_continuous(breaks=seq(0, 10, 0.25))  # Ticks from 0-10, every .25

 ### 点到坐标轴的方向

# Reverse order of a continuous-valued axis
bp + scale_y_reverse()

设置和隐藏坐标轴的刻度

# Setting the tick marks on an axis
# 显示刻度从1到10,间隔为0.25
# The scale will show only the ones that are within range (3.50-6.25 in this case)
bp + scale_y_continuous(breaks=seq(1,10,1/4))

# 未设置刻度的地方会出现空白
bp + scale_y_continuous(breaks=c(4, 4.25, 4.5, 5, 6,8))

# 隐藏刻度
bp + scale_y_continuous(breaks=NULL)

# 隐藏刻度但是显示标签
bp + theme(axis.ticks = element_blank())

坐标轴的数据转换(log, sqrt, etc.)

坐标轴可以进行线性变换,比如 log, power, roots 等等

这里有两种方式对数据进行转换, 一种是比例转换, 另一种是坐标转换. 对于比例变换, 在坐标轴刻度和范围被决定之前发生变换, 也就是先绘制图形,在标明刻度; 对于坐标变换, 在坐标轴刻度和范围被决定之后发生变换.也就是先标明刻度再绘制图形.

具体的理解可以看下面的例子.

# 指数分布的数据
set.seed(201)
n <- 100
dat <- data.frame(
    xval = (1:n+rnorm(n,sd=5))/20,
    yval = 2*2^((1:n+rnorm(n,sd=5))/20)
)

# 散点图
sp <- ggplot(dat, aes(xval, yval)) + geom_point()
sp

# log2 scaling of the y axis (with visually-equal spacing)
library(scales)     # Need the scales package
## 
## Attaching package: 'scales'
## The following objects are masked from 'package:readr':
## 
##     col_factor, col_numeric
# 比例变换 scale transformation
sp + scale_y_continuous(trans=log2_trans())

# 坐标变换
sp + coord_trans(y="log2")

# 设置刻度和标签
sp + scale_y_continuous(trans = log2_trans(),
                        breaks = trans_breaks("log2", function(x) 2^x), # 这里很有意思,可以着重看一下帮助文档
                        labels = trans_format("log2", math_format(2^.x)))

这里还有很多其他的变换, 可以 ?trans_new 查看帮助

set.seed(205)
n <- 100
dat10 <- data.frame(
    xval = (1:n+rnorm(n,sd=5))/20,
    yval = 10*10^((1:n+rnorm(n,sd=5))/20)
)

sp10 <- ggplot(dat10, aes(xval, yval)) + geom_point()

# log10
sp10 + scale_y_log10()

# 根据 log10 设置 刻度
sp10 + scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                     labels = trans_format("log10", math_format(10^.x)))

Fixed ratio between x and y axes ### 修改 x 和 y 的比例

# Data where x ranges from 0-10, y ranges from 0-30
set.seed(202)
dat <- data.frame(
    xval = runif(40,0,10),
    yval = runif(40,0,30)
)
sp <- ggplot(dat, aes(xval, yval)) + geom_point()

# 设置为x:y = 1:1
sp + coord_fixed()

# x:y = 1:3
sp + coord_fixed(ratio=1/3)

坐标轴标签的格式

设置和隐藏坐标标题

bp + theme(axis.title.x = element_blank()) +   # Remove x-axis label
     ylab("Weight (Kg)")                       # Set y-axis label

# 另一种方法
bp + scale_x_discrete(name="") +
     scale_y_continuous(name="Weight (Kg)")

改变字体和旋转 刻度标签

element_text 可以设置文本的格式

# Change font options:
# X-axis label: bold, red, and 20 points
# X-axis tick marks: rotate 90 degrees CCW, move to the left a bit (using vjust,
#   since the labels are rotated), and 16 points
bp + theme(axis.title.x = element_text(face="bold", colour="#990000", size=20),
           axis.text.x  = element_text(angle=90,# 设置旋转的角度
                                       vjust=0.5,# 设置纵向便宜距离 hjust为横向偏移距离
                                       size=16) # 字体的大小
           )

刻度标签的格式化

# Label formatters
library(scales)   # Need the scales package
bp + scale_y_continuous(labels=percent) + # 显示百分比
     scale_x_discrete(labels=abbreviate)  #没有效果

对于连续型数据的格式化包括 comma, percent, dollar 和科学计数法 对于离散型数据的格式化, abbreviate(缩略词) 将会去除元音和空格,对于日期可以使用 date_format

当然也可以创作自己的格式, 比如 HH:MM:SS 时间格式

# Self-defined formatting function for times.
timeHMS_formatter <- function(x) {
    h <- floor(x/60)
    m <- floor(x %% 60)
    s <- round(60*(x %% 1))                   # Round to nearest second
    lab <- sprintf('%02d:%02d:%02d', h, m, s) # Format the strings as HH:MM:SS
    lab <- gsub('^00:', '', lab)              # Remove leading 00: if present
    lab <- gsub('^0', '', lab)                # Remove leading 0 if present
    # 返回 lab
}

bp + scale_y_continuous(label=timeHMS_formatter)

 隐藏参考线

# 隐藏所有参考线(minor, major)
bp + theme(panel.grid.minor=element_blank(),
           panel.grid.major=element_blank())

# 隐藏 minor
bp + theme(panel.grid.minor=element_blank())

 根据坐标轴的方向隐藏

# 隐藏 纵向
bp + theme(panel.grid.minor.x=element_blank(),
           panel.grid.major.x=element_blank())

# 隐藏 横向
bp + theme(panel.grid.minor.y=element_blank(),
           panel.grid.major.y=element_blank())

  • 22
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
中译本序, 每当我们看到一个新的软件,第一反应会是:为什么又要发明一个新软件?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的发展也将越来越依赖于用户的贡献,这也是很多开源软件最终的走向。, 关于版本更新, 原书面

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值