查看原文
其他

ggplot2修改坐标轴详细介绍

阿越就是我 医学和生信笔记 2023-06-15
关注公众号,发送R语言Python,获取学习资料!


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

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

  • 交换x轴和y轴

  • 设置坐标轴范围

  • 使图形从0开始

  • 反转连续型坐标轴

  • 修改类别型坐标轴的顺序

  • 设置x轴和y轴的比例

  • 设置刻度线位置

  • 移除刻度线和标签

  • 修改刻度标签

  • 修改坐标轴标签

  • 沿坐标轴显示直线

  • 使用对数坐标轴

  • 环状图形

  • 日期坐标轴

交换x轴和y轴

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

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()就可以实现。

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

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种图形展示。

p3 <- p+coord_cartesian(ylim = c(0,5000))

p+p1+p3
plot of chunk unnamed-chunk-3

使图形从0开始

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()

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参数即可。

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

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()函数。

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参数。连续型变量和分裂变量的使用效果不一样。

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()中修改。

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

修改刻度标签

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包,那这个坐标轴标签还有各种花样玩法。

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()函数修改。

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()

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()函数中修改。

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

沿坐标轴显示直线

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

使用对数坐标轴

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

环状图形

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
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
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

日期坐标轴

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

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


以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发


欢迎扫描二维码加 QQ群 613637742


欢迎关注公众号:医学和生信笔记




往期回顾

使用R语言画森林图和误差线(合辑)


韦恩图进阶!upset plot 04


韦恩图进阶!ggupset版upset plot


你还不会画网络图


R语言生信表学习之网络图

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存