前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ggplot2修改坐标轴详细介绍

ggplot2修改坐标轴详细介绍

作者头像
医学和生信笔记
发布2022-11-15 09:56:39
10.4K0
发布2022-11-15 09:56:39
举报
文章被收录于专栏:医学和生信笔记

ggplot2的每个细节都是可以修改的,非常推荐大家系统学习一下,用到再学确实是一种不错的方式,但是如果要提高进阶,还是有必要系统学习的。

今天给大家介绍下如何自定义ggplot2坐标轴。

  • 交换x轴和y轴
  • 设置坐标轴范围
  • 使图形从0开始
  • 反转连续型坐标轴
  • 修改类别型坐标轴的顺序
  • 设置x轴和y轴的比例
  • 设置刻度线位置
  • 移除刻度线和标签
  • 修改刻度标签
  • 修改坐标轴标签
  • 沿坐标轴显示直线
  • 使用对数坐标轴
  • 环状图形
  • 日期坐标轴

交换x轴和y轴

在很久以前的版本中,还只能通过coord_flip()函数实现,现在支持直接换一下x轴和y轴的映射即可。

代码语言:javascript
复制
library(ggplot2)
library(patchwork)

p <- ggplot(diamonds, aes(cut, price))+
  geom_boxplot()

# 方法1
p1 <- p+coord_flip()

# 方法2
p2 <- ggplot(diamonds, aes(price, cut))+
  geom_boxplot()

p + p1 + p2

plot of chunk unnamed-chunk-1

设置坐标轴范围

直接使用scale_x_continuous()/scale_y_continuous()或者xlim()/ylim()就可以实现。

这个方法很好用,尤其是遇到画气泡图、散点图,发生图形显示不全的情况,只要增加下坐标轴范围就解决了!

代码语言:javascript
复制
p1 <- p+scale_y_continuous(limits = c(0,5000))
p2 <- p+ylim(c(0,5000))

p1+p2

plot of chunk unnamed-chunk-2

这种方法是把设定范围以外的数据完全去掉,而coord_cartesian()函数可以局部放大或者缩小图形。

下面是原图、限定坐标轴之后、放大局部,3种图形展示。

代码语言:javascript
复制
p3 <- p+coord_cartesian(ylim = c(0,5000))

p+p1+p3

plot of chunk unnamed-chunk-3

使图形从0开始

代码语言:javascript
复制
tmp <- data.frame(cols = paste0("col",1:5),
                  values = seq(20,60,by=10)
                  )
# 默认图形的底部总是留有空隙
p <- ggplot(tmp, aes(cols, values))+
  geom_bar(stat = "identity")

# 只需要使用expand参数即可,非常简单!
p1 <- p+scale_y_continuous(expand = c(0,0))

p+p1

plot of chunk unnamed-chunk-4

反转连续型坐标轴

直接使用scale_x_reverse()/scale_y_reverse()

代码语言:javascript
复制
p <- ggplot(diamonds, aes(carat, price))+
  geom_point()

p1 <- p+scale_x_reverse()

p+p1

plot of chunk unnamed-chunk-5

修改类别型坐标轴的顺序

使用scale_x_discrete()中的limits参数即可。

或者在原始数据中,先设置好分类变量的因子顺序。

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+
  geom_boxplot()

p1 <- p+scale_x_discrete(limits=c("Very Good","Good","Premium","Ideal","Fair"))

p+p1

plot of chunk unnamed-chunk-6

设置x轴和y轴的比例

使用coord_fixed()函数。

代码语言:javascript
复制
p <- ggplot(data.frame(x=1:10,y=1:10), aes(x=x,y=y)) + geom_point()

p1 <- p+coord_fixed(2) # 设置的是单位长度的比例

p+p1

plot of chunk unnamed-chunk-7

设置刻度线位置

使用breaks参数。连续型变量和分裂变量的使用效果不一样。

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+
  geom_boxplot()

# 连续型变量
p1 <- p+scale_y_continuous(breaks = c(1000,3000,7000,12000))

# 分类变量
p2 <- p+scale_x_discrete(breaks=c("Good","Ideal","Fair"))

p+p1+p2

plot of chunk unnamed-chunk-8

移除刻度线和标签

需要在theme()中修改。

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+geom_boxplot()

# 外观也是可以修改的
p1 <- p+theme(axis.ticks.x = element_line(color = "red",size = 2))
p2 <- p+theme(axis.ticks = element_blank())

p+p1+p2

plot of chunk unnamed-chunk-9

修改刻度标签

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+geom_boxplot()

p1 <- p+scale_y_continuous(breaks = c(0,1000,3000,9000,12000),
                           labels = c("你好","nihao","你不好","haha","哈哈")
                           )

p+p1

plot of chunk unnamed-chunk-10

如果你读过我之前介绍过的scales包,那这个坐标轴标签还有各种花样玩法。

代码语言:javascript
复制
library(scales)

p2 <- p+scale_y_continuous(labels = label_number_si())
p3 <- p+scale_y_continuous(labels = label_scientific())
p4 <- p+scale_y_continuous(labels = label_comma())

p2+p3+p4

plot of chunk unnamed-chunk-11

如果想要修改颜色、方向、粗细等,就要使用theme()函数修改。

代码语言:javascript
复制
p1 <- p+theme(axis.text.x = element_text(color = "red",size = 14,angle = 45,
                                         hjust = 1,vjust = 1
                                         ),
              axis.text.y = element_text(color = "blue","size=15",angle = 90)
              )

p+p1

plot of chunk unnamed-chunk-12

修改坐标轴标签

直接使用name参数即可,或者也可以用xlba()/ylab()

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+geom_boxplot()

p1 <- p+scale_x_discrete(name="不同切工\n可以换行")+
  scale_y_continuous(name="price $") # 不显示就直接用NULL

p2 <- p+labs(x="不同切工\n可以换行",y="price $")

p+p1+p2

plot of chunk unnamed-chunk-13

如果要改变坐标轴标签的外观,比如颜色、字体、方向等,也是要在theme()函数中修改。

代码语言:javascript
复制
p3 <- p+theme(axis.title.x = element_text(size = 15,color = "red"),
              axis.title.y=element_text(face="italic", colour="darkred",size=14)
              )

p+p3

plot of chunk unnamed-chunk-14

沿坐标轴显示直线

代码语言:javascript
复制
p <- ggplot(diamonds, aes(cut, price))+geom_boxplot()
p1 <- p+theme(axis.line = element_line(color = "red"))

p+p1

plot of chunk unnamed-chunk-15

使用对数坐标轴

代码语言:javascript
复制
p <- ggplot(msleep, aes(bodywt, brainwt)) +
 geom_point(na.rm = TRUE) +
 scale_x_log10(
   breaks = scales::trans_breaks("log10", function(x) 10^x),
   labels = scales::trans_format("log10", scales::math_format(10^.x))
 ) +
 scale_y_log10(
   breaks = scales::trans_breaks("log10", function(x) 10^x),
   labels = scales::trans_format("log10", scales::math_format(10^.x))
 ) +
 theme_bw()

p1 <- p + annotation_logticks()                # 默认情况刻度线在下边和左边

p2 <- p + annotation_logticks(sides = "lr")    # 刻度线在左边和右边

p3 <- p + annotation_logticks(sides = "trbl")  # 四条边添加刻度线


p4 <- p + annotation_logticks(sides = "lr", outside = TRUE) +
 coord_cartesian(clip = "off")  

p+p1+p2+p3+p4+plot_layout(nrow = 3)

plot of chunk unnamed-chunk-16

环状图形

代码语言:javascript
复制
pie <- ggplot(mtcars, aes(x = factor(1), fill = factor(cyl))) +
 geom_bar(width = 1)
pie1 <- pie + coord_polar(theta = "y")
pie2 <- pie + coord_polar()

pie+pie1+pie2+plot_layout(guides = "collect")

plot of chunk unnamed-chunk-17

代码语言:javascript
复制
cxc <- ggplot(mtcars, aes(x = factor(cyl))) +
  geom_bar(width = 1, colour = "black")
cxc1 <- cxc + coord_polar()

cxc2 <- cxc + coord_polar(theta = "y")

cxc+cxc1+cxc2

plot of chunk unnamed-chunk-18

代码语言:javascript
复制
if (require("ggplot2movies")) {
movies$rrating <- cut_interval(movies$rating, length = 1)
movies$budgetq <- cut_number(movies$budget, 4)

doh <- ggplot(movies, aes(x = rrating, fill = budgetq))

doh + geom_bar(width = 1) + coord_polar()

doh + geom_bar(width = 0.9, position = "fill") + coord_polar(theta = "y")
}
## 载入需要的程辑包:ggplot2movies

plot of chunk unnamed-chunk-19

日期坐标轴

只需要把日期类型的变量映射给坐标轴即可。

代码语言:javascript
复制
p <- ggplot(economics, aes(x=date, y=psavert)) + geom_line()

library(scales)

p1 <- p+scale_x_date(breaks = breaks_width("5 years"),
                     labels = label_date(format = "%Y"),
                     name = NULL
                     )+
  theme(axis.text.x = element_text(angle = 45,vjust = 0.5))

p1/p

plot of chunk unnamed-chunk-20

以上就是今天的内容,希望对你有帮助哦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 医学和生信笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 交换x轴和y轴
  • 设置坐标轴范围
  • 使图形从0开始
  • 反转连续型坐标轴
  • 修改类别型坐标轴的顺序
  • 设置x轴和y轴的比例
  • 设置刻度线位置
  • 移除刻度线和标签
  • 修改刻度标签
  • 修改坐标轴标签
  • 沿坐标轴显示直线
  • 使用对数坐标轴
  • 环状图形
  • 日期坐标轴
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档