ggplot2修改坐标轴详细介绍
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
设置坐标轴范围
直接使用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
这种方法是把设定范围以外的数据完全去掉,而coord_cartesian()
函数可以局部放大或者缩小图形。
下面是原图、限定坐标轴之后、放大局部,3种图形展示。
p3 <- p+coord_cartesian(ylim = c(0,5000))
p+p1+p3
使图形从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
反转连续型坐标轴
直接使用scale_x_reverse()/scale_y_reverse()
。
p <- ggplot(diamonds, aes(carat, price))+
geom_point()
p1 <- p+scale_x_reverse()
p+p1
修改类别型坐标轴的顺序
使用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
设置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
设置刻度线位置
使用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
移除刻度线和标签
需要在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
修改刻度标签
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
如果你读过我之前介绍过的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
如果想要修改颜色、方向、粗细等,就要使用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
修改坐标轴标签
直接使用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
如果要改变坐标轴标签的外观,比如颜色、字体、方向等,也是要在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
沿坐标轴显示直线
p <- ggplot(diamonds, aes(cut, price))+geom_boxplot()
p1 <- p+theme(axis.line = element_line(color = "red"))
p+p1
使用对数坐标轴
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)
环状图形
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")
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
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
日期坐标轴
只需要把日期类型的变量映射给坐标轴即可。
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
以上就是今天的内容,希望对你有帮助哦!欢迎点赞、在看、关注、转发!
欢迎扫描二维码加 QQ群 :613637742
欢迎关注公众号:医学和生信笔记
往期回顾
使用R语言画森林图和误差线(合辑)
韦恩图进阶!upset plot 04
韦恩图进阶!ggupset版upset plot
你还不会画网络图?
R语言生信图表学习之网络图