我正在使用大小为2 x 400的数据框。我需要在与我项目的主数据集相同的图形上绘制图形(我们称之为数据集A)。
我所需要的只是数据集A图的一般形状。即我只需要看到趋势。
数据集A发生的比例恰好小于主图的比例。所以数据集A看起来就像一条水平线。
我决定通过将数据集A乘以系数来缩放数据集A.我尝试了各种值来获得最佳的垂直缩放,这使我遇到了问题。
当试图通过反复试验找到理想的乘法因子时,我期望数据集A的图形的一般形状保持其形状,并且仅在其相对垂直点上变化。即所有最大值和分钟的水平坐标不应移动,只有垂直点应移动。但这没有发生。我想知道原因。
这是数据集A(黄色)乘以因子3:
因子5:
黄点是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))
答案 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
我通常不会回答数据不可复制的问题,因为我讨厌缺乏清晰度而且我讨厌无法测试。但是,你的问题非常明确,我很确定即使没有测试也能正常工作。手指交叉!
其他一些更一般的评论:
很高兴您知道要将因子转换为数字,您需要通过字符。这是一个烦恼,但如果你想了解更多here's the r-faq on it。
我不确定您为什么在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的原因。
您的x
循环可能会被for
函数替换。 (见下文。)
您似乎只是踏上diff()
门,所以我在推荐中使用了基本功能。继续使用dplyr
,我认为您会喜欢它。您 使用的dplyr
功能是dplyr
。mutate
。它的作用类似base::transform
,用于添加新列。
我不喜欢你创造了所有这些不同的数据框架,它使事情变得混乱。我认为你的代码可以简化为类似的东西
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
)
不是为原始数据,一阶导数和二阶导数设置单独的数据帧,而是将它们全部放在同一数据帧中。
在一个数据框中拥有东西的最大好处是,您可以随时收集&#34;它变成了一个漂亮的,长的(而不是宽的)整洁的格式并简化了你的绘图调用:
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))
对于长格式的数据,您有一列数据(我已将其命名为&#34;功能&#34;)映射到颜色,因此您没有一次添加一个图层,你就可以得到一个很好的图例!