2011-02-23 155 views
42

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

在图中,我想用5个相应的文本标签替换它。有没有可能在ggplot中做到这一点?

回答

42

你应该能够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) 
+5

唉,如果x轴不是一个因素,这不起作用。 – gappy 2011-02-24 16:32:11

+1

@gappy - 这里的关键是将您的x轴转换为一个因子。 @prasad和我提供的解决方案在ggplot调用本身(“factor(x)”和“ordered(x)”位)中执行此操作,而@ Gavin在预处理步骤中处理它。所有三个答案的最终结果是'x轴'在绘图之前被视为一个因素。 – Chase 2011-02-24 16:46:11

+2

@gappy您的数据*是* R将会考虑的一个因素 - 至少从您给出的简要说明。数据可以取值1.5吗?如果他们能够得到那些数据点的标签?如果你的数据*是有序的,那么你应该告诉R这个并存储为/ coerce到一个因子(因子())或有序因子('ordered()')。如果你这样做,它会在很多情况下做正确的事情。看我的答案 - 如果你告诉R数据是一个因素,绘制正确的图表。 @Chase和@Prasad的答案强制作为情节的一部分,并允许运行时定制标签。 – 2011-02-24 19:45:55

2

这里是一个重复的例子,我觉得你的封装Q(?):

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

如果这是不是你的意思,你可以编辑你的Q来提供一个例子吗?

10

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]) 
+0

不是一个大的ggplot用户,是不是'scale_x_discrete'暗示如果'x'是一个因素?如果是这样,是否有直接调用它的优势,而不是在数据中获得正确的因子标签?我可以和@Chase一样询问他提供了相同的答案吗? – 2011-02-23 21:29:00

+0

@Gavin你是对的 - 'scale_x_discrete'只用于覆盖默认的因子标签。如果你有一个数据框,并且你想在不同情况下对它进行不同的绘制(即每次使用不同的标签),那么我认为这很有用,这样你就不必每次都改变数据框。 – 2011-02-23 21:55:26

+0

@Gavin&@Prasad - 我理解OP的问题意味着他有数字值,他想在这种情况下表示为分类或序数。有趣的是,Prasad和我essentailly制定了相同的答案。有没有比'factor()'更有序的()'? – Chase 2011-02-23 22:39:25