尝试使用R,ggplot2

时间:2016-02-12 02:07:09

标签: r ggplot2

我正在使用大小为2 x 400的数据框。我需要在与我项目的主数据集相同的图形上绘制图形(我们称之为数据集A)。

我所需要的只是数据集A图的一般形状。即我只需要看到趋势。

数据集A发生的比例恰好小于主图的比例。所以数据集A看起来就像一条水平线。

我决定通过将数据集A乘以系数来缩放数据集A.我尝试了各种值来获得最佳的垂直缩放,这使我遇到了问题。

当试图通过反复试验找到理想的乘法因子时,我期望数据集A的图形的一般形状保持其形状,并且仅在其相对垂直点上变化。即所有最大值和分钟的水平坐标不应移动,只有垂直点应移动。但这没有发生。我想知道原因。

这是数据集A(黄色)乘以因子3:

enter image description here

因子5:

enter image description here

黄点是geom_point,黄色曲线是对应的geom_smooth

编辑: 这是我的代码原始代码: 我没有接受过很多正式的代码培训。我为任何混乱而道歉!

library("ggplot2")
library("dplyr")

# READ IN DATA
temp_data <-read.table(col.names = "y",
  "C:/Users/Ben/Documents/Visual Studio 2013/Projects/Home/Home/steamdata2.txt")

boilpoint <- which(temp_data$y == "boil")    # JUST A MARKER..
temp_data <- filter(temp_data, y != "boil")  # GETTING RID OF THE MARKER ENTRY

# DON'T KNOW WHY BUT I HAD TO DO THIS INTERMEDIATE STEP
# BEFORE I COULD CONVERT FROM FACTOR -> NUMERIC
temp_data$y <- as.character(temp_data$y)        

# CONVERTING TO NUMERIC   
temp_data$y <- as.numeric(temp_data$y)          

# GETTING RID OF BASICALLY THE LAST ENTRY WHICH HAS THE LARGEST VALUE
temp_data <- filter(temp_data, y<max(temp_data$y)) 

# ADD ANOTHER COLUMN WITH THE ROW NUMBER,
# BECAUSE I DON'T KNOW HOW TO ACCESS THIS FOR GGPLOT
temp_data <- transform(temp_data, x = 1:nrow(temp_data))   


n <- nrow(temp_data)         # Num of readings
period <- temp_data[n,1]     # (sec)
RpS <- n / period            # Avg Readings per Second

MIN <- min(temp_data$y)
MAX <- max(temp_data$y)

# DERIVATIVE OF ORIGINAL
deriv <- data.frame(matrix(ncol=2, nrow=n))  

# ADD ANOTHER COLUMN TO ACCESS ROW NUMBERS FOR GGPLOT LATER     
colnames(deriv) <- c("y","x")
deriv <- transform(deriv, x = c(1:n))         

# FILL DERIVATIVE DATAFRAME
deriv[1, 1] <- 0
for(i in 2:n){              
  deriv[i - 1, 1] <- temp_data[i, 1] - temp_data[i - 1, 1]
}
deriv <- filter(deriv, y != 0)

# DID THE SAME FOR SECOND DERIVATIVE
dderiv <- data.frame(matrix(ncol = 2, nrow = nrow(deriv)))
colnames(dderiv) <- c("y", "x")
dderiv <- transform(dderiv, x=rep(0, nrow(deriv)))
dderiv[1, 1] <- 0
for(i in 2:nrow(deriv)) {
  dderiv$y[i - 1] <- (deriv$y[i] - deriv$y[i - 1]) /
                         (deriv$x[i] - deriv$x[i - 1])
  dderiv$x[i - 1] <- deriv$x[i] + (deriv$x[i] - deriv$x[i - 1]) / 2
}
dderiv <- filter(dderiv, y!=0)

# HERE'S WHERE I FACTOR BY VARIOUS MULTIPLES 
deriv <- MIN  + deriv * 3        
dderiv <- MIN  + dderiv * 3      

graph <- ggplot(temp_data, aes(x, y)) + geom_smooth()
graph <- graph + geom_point(data = deriv, color = "yellow")
graph <- graph + geom_smooth(data = deriv, color = "yellow")
graph <- graph + geom_point(data = dderiv, color = "green")
graph <- graph + geom_smooth(data = dderiv, color = "green")
graph <- graph + geom_vline(xintercept = boilpoint, color = "red")
graph <- graph + xlab("Readings (n)") +
    ylab(expression(paste("Temperature  (",degree,"C)")))
graph <- graph + xlim(c(0,n)) + ylim(c(MIN, MAX))

1 个答案:

答案 0 :(得分:1)

如果没有您的原始数据,很难检查,但我99%确定您的主要问题是您使用{{1}对y限制进行硬编码}}。错误地缩放ylim(c(MIN, MAX))deriv数据框中的变量而不只是dderiv会加剧这种情况。

当我注意到你的顶级&#34;缩放3&#34;我能够调试问题。图表有很多比你的底部更多的黄点&#34;按比例缩放5&#34;曲线图。

快速解决方法是不要缩放行号,只缩放y值,也就是说,替换此

y

用这个:

# scales entire data frame: bad!
deriv <- MIN  + deriv * 3        
dderiv <- MIN  + dderiv * 3 

认为还有另一个问题:即使我上面的修正,也会排除你的衍生品的负值。如果# only scale y deriv$y <- MIN + deriv$y * 3 dderiv$y <- MIN + dderiv$y * 3 deriv$y为负数,那么dderiv$y将小于MIN + deriv$y * 3,并且因为您的y轴从MIN开始,所以它赢了被绘制。

所以我认为整个修复方法是做一些像

这样的事情
MIN

我通常不会回答数据不可复制的问题,因为我讨厌缺乏清晰度而且我讨厌无法测试。但是,你的问题非常明确,我很确定即使没有测试也能正常工作。手指交叉!

其他一些更一般的评论:

  1. 很高兴您知道要将因子转换为数字,您需要通过字符。这是一个烦恼,但如果你想了解更多here's the r-faq on it

  2. 我不确定您为什么在for循环中烦扰# keep the original y values around so we can experiment with scaling # without running *all* the code again deriv$y_orig <- deriv$y # multiplicative scale # fill in the value of `prop` to be the proportion of the vertical plot area # that you want taken up by the derivative deriv$y <- deriv$y_orig * diff(c(MIN, MAX)) / diff(range(deriv$y_orig)) * prop # shift into plot range # fill in the value of `intercept` to be the y value of the # lowest point of this line deriv$y <- deriv$y + MIN - min(deriv$y) + 1 。由于您将(deriv$x[i] - deriv$x[i - 1])定义为1,2,3,...差异始终为1.我更加困惑的是您在二阶导数中除以2的原因。

  3. 您的x循环可能会被for函数替换。 (见下文。)

  4. 您似乎只是踏上diff()门,所以我在推荐中使用了基本功能。继续使用dplyr,我认为您会喜欢它。您 使用的dplyr功能是dplyrmutate。它的作用类似base::transform,用于添加新列。

  5. 我不喜欢你创造了所有这些不同的数据框架,它使事情变得混乱。我认为你的代码可以简化为类似的东西

    all_data = filter(temp_data, y != "boil") %>%
        mutate(y = as.numeric(as.character(y))) %>%
        filter(y < max(y)) %>%
        mutate(
            x = 1:n(),
            deriv = c(NA, diff(y)) / c(NA, diff(x)),
            dderiv = c(NA, diff(deriv)) / 2
        )
    
  6. 不是为原始数据,一阶导数和二阶导数设置单独的数据帧,而是将它们全部放在同一数据帧中。

    1. 在一个数据框中拥有东西的最大好处是,您可以随时收集&#34;它变成了一个漂亮的,长的(而不是宽的)整洁的格式并简化了你的绘图调用:

      library(tidyr)
      long_data = gather(all_data, key = function, value = y, y, deriv, dderiv)
      
    2. 然后你的ggplot调用看起来更像是这样:

      graph <- ggplot(temp_data, aes(x, y, color = function)) + 
         geom_smooth() +
         geom_point() +
         geom_vline(xintercept = boilpoint, color = "red") +
         scale_color_manual(values = c("green", "yellow", "blue")) +
         xlab("Readings (n)") +
         ylab(expression(paste("Temperature  (",degree,"C)"))) +
         xlim(c(0,n)) + ylim(c(MIN, MAX))
      

      对于长格式的数据,您有一列数据(我已将其命名为&#34;功能&#34;)映射到颜色,因此您没有一次添加一个图层,你就可以得到一个很好的图例!