自定义坐标轴标签

66

我有一个简单的geom_point图,其中x变量是序数变量,有5个值(编码为1:5)。

在图中,我想用5个相应的文本标签替换它。在ggplot中是否可以实现?

4个回答

60

你可以使用 scale_x_discrete 完成这个任务。

library(ggplot2)
df <- data.frame(x = 1:5, y = sample(1:10, 5, TRUE))

qplot(factor(x),y, data = df) + 
scale_x_discrete(breaks = 1:5, labels=c("foo","bar","baz","phi","fum")) +
xlab(NULL)

2
@gappy - 这里的关键是将你的x轴转换为因子。@prasad和我提供的解决方案在ggplot调用本身中完成了这一点(factor(x)ordered(x)部分),而@Gavin的解决方案则在预处理步骤中处理它。所有三个答案的最终结果都是在绘图之前将x轴视为因子来处理。 - Chase
2
@gappy,根据你提供的简要描述,你的数据 R 认为的因子。这些数据可以取1.5的值吗?如果可以,那么这些数据点应该被标记为什么?如果你的数据有序的,那么你应该告诉 R 并将其存储为/强制转换为因子(factor())或有序因子(ordered())。如果你这样做,在许多情况下它会做正确的事情。请参见我的答案——如果你告诉 R 数据是一个因子,它会绘制出正确的图形。@Chase 和 @Prasad 的答案作为绘图的一部分进行强制转换,并允许在运行时自定义标签。 - Gavin Simpson
@Gavin - 运行时自定义标签...非常好的方式来总结我们在过去6个评论中所探讨的内容。 - Chase
不是所有情况下都适用于scale_x_discrete,应该使用scale_x_continuous。 - Al14

13

scale_x_discrete 可以实现此功能:

x <- sample(1:5, 20, T)
y <- rnorm(20) + x

df <- data.frame(x = ordered(x), y = y)

ggplot(df,aes(x,y)) + geom_point() + 
   scale_x_discrete(breaks = 1:5, labels = letters[1:5])

作为一个不太常用ggplot的用户,如果x是一个因子,那么scale_x_discrete是否被隐含了呢?如果是这样,直接调用它是否比在数据中正确获取因子标签更有优势?我可以向@Chase提出同样的问题,因为他/她给出了相同的答案。 - Gavin Simpson
@Gavin 你说得对 -- scale_x_discrete 只用于覆盖默认的因子标签。我想如果你有一个数据框,而且你想在不同的情况下以不同的方式绘制它(即每次使用不同的标签),那么这个函数就很有用了,这样你就不必每次都改变数据框了。 - Prasad Chalasani
@Gavin和@Prasad - 我理解OP的问题是他想将数字值表示为分类或有序的情况。有趣的是,Prasad和我基本上开发了相同的答案。在ordered()factor()之间有偏好吗? - Chase
@Chase 我明白 - 我们三个答案都做了同样的事情(据我所知),只是从两个不同的角度来看。我的偏好是修改数据以正确存储,因此我的答案; 只是想知道 scale_x_discrete() 的优缺点。 - Gavin Simpson

3

这里是一个可重现的例子,我认为它包含了你的问题:

require(ggplot2)
dat <- data.frame(X = sample(1:5, 100, replace = TRUE),
                  Y = rnorm(100))

现在不清楚你有哪些数据,但如果你的意思是这样的:

(p1 <- ggplot(dat, aes(x = X, y = Y)) + geom_point())

那么我认为您需要一个条形图,可以通过ggplot中的因子实现。
dat2 <- within(dat, X <- factor(X, labels = letters[1:5]))
(p2 <- ggplot(dat2, aes(x = X, y = Y)) + geom_point())

如果这不是您想要的,请编辑您的问题以提供示例。


0

另一种选项是使用scale_x_continuous,在数值连续轴上指定breakslabels。以下是一些可重现的代码:

library(ggplot2)
df <- data.frame(x = 1:5, y = sample(1:10, 5, TRUE))
ggplot(df, aes(x = x, y = y)) +
  geom_point() +
  scale_x_continuous(breaks = c(1:5), labels = c("A", "B", "C", "D", "E"))

使用reprex v2.0.2于2023年2月3日创建


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接