带限制的ggplot + scale_x_reverse会丢弃所有数据

时间:2017-01-25 03:06:57

标签: r ggplot2

我试图用ggplot2绘制一些数据,但我发现如果我在定义限制时组合了scale_x_reverse函数,那么所有数据都会被排除在外。

例如,在本文底部的测试数据集中,我想在y轴上绘制" Depth"对#" corvals"在x轴上。我还希望y轴在顶部为0,在底部为最深,并且仅显示顶部150m。

我认为完成此操作的合理代码看起来像

ggplot(testdata, aes(Depth, corvals)) + 
geom_point() + geom_line() + coord_flip() + scale_x_reverse(limits = c(0, 150))

然而在这种情况下我收到了警告信息

  

警告讯息:

Removed 19 rows containing missing values (geom_point).

然后情节没有显示任何数据点。

相比之下,以下两个代码示例可以正常工作。

限制,但不会翻转深度轴:

ggplot(testdata, aes(Depth, corvals)) + 
geom_point() + geom_line() + coord_flip() + xlim(0, 150)

翻转,但不限制深度轴:

ggplot(testdata, aes(Depth, corvals)) + 
geom_point() + geom_line() + coord_flip() + scale_x_reverse()

有没有办法将这两个功能结合在一起,我不知道?

  

TESTDATA

Depth   corvals

10    0.0000
48 1047.6866
52  919.3938
55  304.5824
58  297.3390
63    0.0000
80    0.0000
85    0.0000
90    0.0000
95    0.0000
100    0.0000
110    0.0000
125    0.0000
140    0.0000
150    0.0000
170    0.0000
180    0.0000
200    0.0000
500    0.0000

3 个答案:

答案 0 :(得分:1)

如果我用你的数据运行以下脚本 - 并不是你所拥有的所有空值(如果交付了一些可用的数据,它会很棒) - 它可以工作。该图按预期绘制。

library(ggplot2)
x <- c(10,48,52,55,58, 63, 80, 85, 100, 150, 300, 500)
y <- c(0,1047.6866, 919.3938, 304.5824, 297.339,0,0,0,0,0,0,0)
df <- as.data.frame(cbind(x,y))
p <- ggplot(df, aes(x,y)) + geom_point() + geom_line()
p <- p +coord_flip() + scale_x_reverse()
p
p + xlim(150,0)

有警告显示 - 在这种情况下 - 删除了两个值。这些是由xlim(150,0)切断的两个值。

答案 1 :(得分:1)

另一种方法是预先对数据进行子集化,因为您不希望显示超出深度150的数据:

ggplot(subset(testdata, Depth <= 150), aes(Depth, corvals)) + 
  geom_point() + geom_line() + coord_flip() + scale_x_reverse()

答案 2 :(得分:0)

Chrisss在评论中的回答运作良好。我只需要翻转限制的顺序,这样就会有更大的数字。

  ggplot(testdata, aes(Depth, corvals)) + geom_point() + geom_line() + coord_flip() + scale_x_reverse(limits = c(150, 0))