ggplot2修改坐标轴详细介绍

ggplot2修改坐标轴详细介绍

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

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

养生小贴士

【攻略】ARK 方舟生存進化 懶人百科 物品百科 @方舟 系列 哈啦板
世界杯男乒赛王励勤出局 战波尔3胜5负处下风
一、什么是股东账号?
💡 小知识

一、什么是股东账号?

📅 11-22 👍 512