ggplot2系列教程 第2节——坐标轴

2025-12-03 23:18:40 6135

本期内容

坐标轴转换

坐标轴调整

本期依然以鸢尾花数据集为例,接着上期的图继续讲解,修改一下主题,初始图形如下:

library(ggplot2)

p <- ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width,

color = Petal.Length, size = Petal.Width,

shape = Species)) +

geom_point() +

scale_color_gradient(low = "#f0cf61", high = "#371722") +

scale_size_continuous(range = c(1, 4)) +

theme_classic() +

labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") +

theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5),

axis.title = element_text(face = "bold"),

legend.title = element_text(face = "bold"),

axis.text = element_text(size = 13),

legend.text = element_text(size = 12))

p

坐标轴转换

ggplot2提供了一些函数来对坐标轴直接进行转换:

scale__log10()* 对数转换

scale__sqrt()* 平方根转换

scale__reverse()* 坐标轴倒序

如下对X轴进行平方根转换,对Y轴进行对数转换:

p + scale_x_sqrt() + scale_y_log10()

坐标轴倒序:

p + scale_x_reverse() + scale_y_reverse()

坐标轴调整

我们看到X轴刻度看起来有点稀疏,我们来调整一下:

SUMM <- summary(iris$Sepal.Length) # 查看下X轴数据分布

SUMM

将X轴设置为从4到8,间隔0.5的刻度:

p + scale_x_continuous(breaks = seq(4, 8, 0.5))

是否发现了4没有显示?这是因为ggplot2默认显示X,Y轴的最小值到最大值范围,如果想要自定义显示范围,只需使用limits参数:

p + scale_x_continuous(breaks = seq(4, 8, 0.5), limits = c(4, 8))

另外,我们也可以设置不规律的坐标轴刻度,如下我们试一下只显示Sepal.Length的最小值、中位值及最大值

X <- SUMM[c("Min.", "Median", "Max.")]

X

p + scale_x_continuous(breaks = as.numeric(X))

还可以自定义坐标轴标签:

Labels <- paste(names(X), as.numeric(X), sep = ": ")

Labels

p + scale_x_continuous(breaks = as.numeric(X), labels = Labels)

一般X轴位于下方,我们还可以将其调整至上方:

p + scale_x_continuous(breaks = as.numeric(X),

labels = Labels,

position = "top")

以上都是对X轴的调整,Y轴同理,如:

p + scale_x_continuous(breaks = as.numeric(X),

labels = Labels,

position = "top") +

scale_y_continuous(breaks = seq(2, 5, 0.5), # Y轴刻度设置为2到5,间隔为0.5

limits = c(2, 5), # 设置Y轴显示范围

position = "right") # 将Y轴放置于右侧

如何调整刻度线呢?这时候我们需要使用theme函数,修改axis.ticks.length参数,为了明显一点,我们将刻度线长度设置为1cm:

p + scale_x_continuous(breaks = as.numeric(X),

labels = Labels,

position = "top") +

scale_y_continuous(breaks = seq(2, 5, 0.5),

limits = c(2, 5),

position = "right") +

theme(axis.ticks.length = unit(1,"cm"))

那么反推,想要刻度线朝内,只需长度设置为负值即可,如下:

p + scale_x_reverse(breaks = as.numeric(X), labels = Labels,

position = "top") +

scale_y_continuous(breaks = seq(2, 5, 0.5),

limits = c(2, 5),

position = "right") +

theme(axis.ticks.length = unit(-0.2,"cm"))

总结一下以上图形完整代码:

ggplot(data = iris, aes(x = Sepal.Length, y = Sepal.Width,

color = Petal.Length, size = Petal.Width,

shape = Species)) +

geom_point() +

scale_color_gradient(low = "#f0cf61", high = "#371722") +

scale_size_continuous(range = c(1, 4)) +

theme_classic() +

labs(x = "Sepal Length", y = "Sepal Width", title = "Iris Sepal") +

theme(plot.title = element_text(size = 15, face = "bold", hjust = 0.5),

axis.title = element_text(face = "bold"),

legend.title = element_text(face = "bold"),

axis.text = element_text(size = 13),

legend.text = element_text(size = 12),

axis.ticks.length = unit(-0.2,"cm")) +

scale_x_continuous(breaks = as.numeric(X),

labels = Labels,

position = "top") +

scale_y_continuous(breaks = seq(2, 5, 0.5),

limits = c(2, 5),

position = "right")

最后

感谢支持,希望对您有帮助!

有不足的地方欢迎指正!

关注我们,及时获取更多干货!