r plot()

时间:2016-09-12 04:12:52

标签: plot ggplot2

我正在建立水柱的垂直剖面图。我的问题是点在x观测值上连接,而不是y观测值。在ggplot下,我知道geom_path可以做到这一点,但我不能使用ggplot,因为我想添加几个x轴。因此我使用plot()。 所以这就是我的尝试:

Storfjorden <- read.delim("C:/Users/carvi/Desktop/Storfjorden.txt")
smooF=smooth.spline(Storfjorden$Fluorescence,Storfjorden$Depth,spar=0.50)
plot(Storfjorden$Fluorescence,Storfjorden$Depth,ylim=c(80,0),type="n")
lines(smooF)

Resulting plot

如您所见,点通过x观察连接。但是为了观察垂直剖面,我希望看到它们通过y观察连接起来。我尝试按深度排序(使用order())并且它不会影响结果。有人有线索吗?

如果作为替代方案,有人会想到如何在单个图(温度,盐度,荧光)上绘制不同轴的不同线,那么我可以使用geom_path()。谢谢!

**我可以回答一个新出现的问题,ggplot中是否有一种方法可以创建geom_smooth(),但是观察连接的顺序是它们出现而不是x轴?

ggplot(melteddf,aes(y=Depth,x=value))+geom_path()+facet_wrap
+(~variable,nrow=1,scales="free‌​_x")+scale_y_reverse‌​()
+geom_smooth(span=‌​0.5,se=FALSE) 

我尝试使用smooth.spline,但没有识别geom_path中的对象。谢谢!

1 个答案:

答案 0 :(得分:0)

有一个原因导致ggplot2难以在单个图上绘制多个x轴 - 它通常会导致难以阅读(或更糟,误导)的图形。如果您有一个激励性的示例,说明为什么您的示例属于其中一个类别,则可能会让我们更多地了解更多详细信息。但是,下面是两个可能有用的解决方法。

这是一个快速的MWE来解决这个问题 - 如果你给我们的东西看起来像你的实际数据可能会更有帮助,但这至少会让事情变得非常不同(尽管没有结构,情节)相当凌乱。

请注意,我正在使用dplyr进行多次操作,并将reshape2 melt数据转换为长格式以便于绘制。

library(dplyr)
library(reshape2)

df <-
  data.frame(
    depth = runif(20, 0, 100) %>% round %>% sort
    , measureA = rnorm(20, 10, 3)  
    , measureB = rnorm(20, 50, 10)
    , measureC = rnorm(20, 1000, 30)
  )


meltedDF <-
  df %>%
  melt(id.vars = "depth")

第一个选项是简单地使用facets来绘制彼此相邻的数据:

meltedDF %>%
  ggplot(aes(y = depth
             , x = value)) +
  geom_path() +
  facet_wrap(~variable
             , nrow = 1
             , scales = "free_x") +
  scale_y_reverse()

enter image description here

第二个是标准化数据,然后绘制。在这里,我使用z-score,但是如果你有理由使用其他东西(例如缩放到#34;适当的&#34;你使用的任何变量的数量)你可以改变那个公式:< / p>

meltedDF %>%
  group_by(variable) %>%
  mutate(Standardized = (value - mean(value)) / sd(value)  ) %>%
  ggplot(aes(y = depth
             , x = Standardized
             , col = variable)) +
  geom_path() +
  scale_y_reverse()

enter image description here

如果您需要绘制多个站点,以下是一些包含站点的示例数据:

df <-
  data.frame(
    depth = runif(60, 0, 100) %>% round %>% sort
    , measureA = rnorm(60, 10, 3)  
    , measureB = rnorm(60, 50, 10)
    , measureC = rnorm(60, 1000, 30)
    , site = sample(LETTERS[1:3], 60, TRUE)
  )


meltedDF <-
  df %>%
  melt(id.vars = c("site", "depth"))

您可以使用facet_grid(我的偏好):

meltedDF %>%
  ggplot(aes(y = depth
             , x = value)) +
  geom_path() +
  facet_grid(site~variable
             , scales = "free_x") +
  scale_y_reverse()

enter image description here

或将facet_wrap添加到标准化图中:

meltedDF %>%
  ggplot(aes(y = depth
             , x = value)) +
  geom_path() +
  facet_grid(site~variable
             , scales = "free_x") +
  scale_y_reverse()

enter image description here