使用scales“free” ggplot2设置分类轴标签

3
我正在尝试使用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)

我注意到我无法在数据框中正确设置标签,因为它们不是唯一的。我知道可以用arrange.grid实现此目的,但如果标签长度不同,则需要手动对齐图表。此外,我希望在图表中包含facet标签,这不是arrange.grid解决方案的可用选项。另外,我还没有尝试使用视口。也许那是解决方案,但我希望这个图表看起来更像faceted图,并且似乎更类似于grid.arrange。
对我来说,这似乎是一个错误,但我愿意接受如何将其作为“特性”的解释。同时,我也希望能有一个简单的解决方案,我可能还没有想到!

1
即使您使用 grid.arrange 将单独的绘图组合起来,仍然可以获得面板条形标签。即使您的分面变量只有一个类别,facet_gridfacet_wrap 仍然可以工作。这并不是说 grid.arrange 解决方案没有其他困难需要克服(正如您所指出的),但我想指出的是,即使是单个绘图,您也可以使用标准的 ggplot 代码获得面板标签。 - eipi10
另一种选择可能是删除轴标签,并在绘图内部使用geom_text添加它们。这个答案展示了一般的思路,尽管在你的情况下,我可以看到跳过stat_summary并直接在每个瓷砖上使用白色文本。 - aosmith
2个回答

2
最简单的方法是在数据集中创建另一列,进行正确的转换。这样更容易审计和操作。如果您坚持手动更改:
您不能直接设置标签,因为它会(我认为)为每个分面循环使用标签向量。相反,您需要使用相应的断点和标签设置转换:
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等等。您可以尝试更改标签值,以查看我所说的内容。只需确保您拥有的每个因素值也在断点参数中表示即可。

这太棒了,完美运作!不过就你的第一个建议而言,一旦正确的列被添加到数据集中,我该如何使用该列来指定正确的标签呢?据我所知,没有用于刻度标签的美学,正如我所指出的,我不能只添加一个y值的列,因为它们不是唯一的,因此无法正确绘制。 - cr1msonB1ade
1
说得好,对于y的不同“真”值重复标签的存在会阻止您添加该列。我不确定您的具体用例是什么,但在我看来,这可能会导致一个相当误导性的图表。 - Chris
我实际上是用它来做一种嵌套的分面(在一个维度中有两个分面),并使用刻度标签作为内部分面的标签(以及添加的geom_hline)。因此,大多数刻度标签实际上是空字符串。我知道我可以用组合的分面变量来完成这个操作,但我想强调一个分面而不是另一个分面,这样做就无法实现。我知道这有点复杂,但我认为这是一种奇怪的行为,所以想问一下。感谢这个解决方法! - cr1msonB1ade

0

我想我可能已经有了解决方案。我的问题是标签不正确,因为正如上面的某个人所说 - 看起来标签向量被循环使用了。这行代码给了我错误的标签。

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_text移动到facet_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)

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


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