2016-02-12 63 views
2

我正在处理一个大小为2 x 400的数据框。我需要在同一个图上绘制该图(我们称它为数据集A)主要数据集为我的项目。尝试使用R垂直缩放数据集的图形,ggplot2

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

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

我决定将数据集A乘以一个因子......我尝试了各种数值以获得最佳的垂直缩放比例,这导致我遇到了问题。

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

这里的数据组A(黄色),当乘以因子3:

因子的5

enter image description here

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)) 
+2

两个建议:在不同的方面绘制数据集A或将所有值标准化为相同的尺度,例如,与'scale :: rescale()' – baptiste

+0

你已经乘以你的x值以及偶然的地方。没有代码,我不能说在哪里。第一个高点在第一个图上是(4500,23.95),第二个是(7500,24.1)。 – timcdlucas

+0

我在我原来的帖子中包含了代码,-timcdlucas。我希望有人能找到一些东西,我需要一个全新的眼睛......我还没有尝试过你的建议baptiste,我会去了解这个功能,并让你知道它是如何发展的。 –

回答

1

很难检查没有你的原始数据,但我99%肯定,你的主要问题是,你硬编码y限制与ylim(c(MIN, MAX))。这是由于意外缩放了您的derivdderiv数据框中的两个变量而不是y

我能够调试问题时,我发现你的顶部“按3缩放”图有很多黄色点比你的底部“缩放5”图更多。

速战速决是规模做不大行号,仅缩放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$ydderiv$y永远为负,那么MIN + deriv$y * 3将小于MIN,并且由于您的y轴始于MIN,因此不会绘制。

所以我觉得整个解决将是不是像做

# 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 

我一般不回答,因为我讨厌不明确,这是不可再现的数据的问题,我讨厌无力测试。但是,您的问题非常清楚,我很确定即使没有测试,这也可以正常工作。手指交叉!


其他一些,更普遍的评论:

  1. 这是很好的,你知道,要素转换为数字,你需要通过文字去。这是一个烦恼,但如果你想了解更多here's the r-faq on it

  2. 我不确定为什么你在for循环中打扰(deriv$x[i] - deriv$x[i - 1])。既然你把x定义为1,2,3 ......,差别总是1.我更加困惑的是你为什么在二阶导数中除以2。

  3. 您的for循环可能可以替换为diff()函数。 (见下面)

  4. 你似乎有只是得到你的脚在dplyr门,所以我在我的建议中使用基函数。继续与dplyr合作,我想你会喜欢它的。 dplyr功能你不是使用的是mutate。它的工作原理与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 
        ) 
    

不是有原始数据,一阶导数和二阶导数单独的数据帧,这使他们都在相同的数据帧。

  1. 在一个数据框中放入东西的好处是,您可以将它“收集”成一个漂亮的,长而整齐的格式,并简化您的绘图调用:

    library(tidyr) 
    long_data = gather(all_data, key = function, value = y, y, deriv, dderiv) 
    

然后你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)) 

随着长格式的数据,你有你的数据列(我南编辑它“函数”)映射到颜色,所以你不必一次添加一个图层,而且你得到了一个很好生成的图例!