r语言 - 使用刻度设置分类轴标签 "free" ggplot2



我正在尝试使用 R (3.1.1) 中的 ggplot2 包 (1.0.1) 在分面图内的分类轴上设置标签,scales="free"。如果我在没有手动设置轴刻度标签的情况下绘制,它们会正确显示(第一个图),但是当我尝试设置标签(第二个图)时,两个面上都只使用前 n 个标签(不像原始标签那样按顺序)。

下面是一个可重现的代码片段,举例说明了这个问题:

foo <- data.frame(yVal=factor(letters[1:8]), xVal=factor(rep(1:4,2)), fillVal=rnorm(8), facetVar=rep(1:2,each=4))
## axis labels are correct
p <- ggplot(foo) + geom_tile(aes(x=xVal, y=yVal, fill=fillVal)) + facet_grid(facetVar ~ ., scales='free')
print(p)
## axis labels are not set correctly
p <- p + scale_y_discrete(labels=c('a','a','b','b','c','d','d','d'))
print(p)

注意到我无法在 data.frame 中正确设置标签,因为它们不是唯一的。我也知道我可以使用 arrange.grid 完成此操作,但如果有不同的长度标签等,这需要"手动"对齐绘图。 此外,我希望在绘图中包含分面标签,这不是 arrange.grid 解决方案的可用选项。我还没有尝试过视口。也许这就是解决方案,但我希望这个情节有更多的多面外观,这似乎更类似于grid.arrange。

在我看来,这似乎是一个错误,但我愿意解释这可能是一个"功能"。我也希望这个问题可能有一个我还没有想到的简单解决方案!

最简单的方法是在数据集中创建另一列并进行正确的转换。这也更容易审计和操作。如果您坚持手动更改:

您不能简单地直接设置标签,因为它会回收(我认为)每个方面的标签向量。相反,您需要使用相应的中断和标签设置转换:

p <- p + scale_y_discrete(labels = c('1','2','3','4','5','6','7','8'), breaks=c('a','b','c','d','e','f','g','h'))
print(p)

a的任何 y 轴值现在都将替换为 1b替换为 2 等。你可以使用标签值来理解我的意思。只需确保您拥有的每个因子值也表示在 break 参数中即可。

我想我实际上可能有一个解决方案。 我的问题是我的标签不正确,因为正如上面有人所说 - 标签载体似乎被回收了。 这行代码给了我不正确的标签。

ggplot(dat, aes(x, y))+geom_col()+facet_grid(d ~ t, switch = "y", scales = "free_x")+ylab(NULL)+ylim(0,10)+geom_text(aes(label = x))

但是,当geom_textfacet_grid之前移动时,下面的代码给了我正确的标签。

ggplot(dat, aes(x, y))+geom_col()+geom_text(aes(label = x))+facet_grid(d ~ t, switch = "y", scales = "free_x")+ylab(NULL)+ylim(0,10)

很有可能误解了上面的问题,但我确实解决了我的问题,所以希望这对某人有所帮助!

最新更新