【问题标题】:Contour plot is not been filled completely using ggplot使用 ggplot 未完全填充等高线图
【发布时间】:2017-12-03 15:39:24
【问题描述】:

我正在尝试使用ggplot 绘制我的第一个填充轮廓图。根据我的数据,我预计会出现以下情况:

但我的结果是:

a <- c(1, 1.1, 1, 1.3, 1.2, 2, 2.2, 2, 2.5, 2.1, 3, 3, 3, 3.1, 3.2)
b <- c(rep(c(0, 5, 10, 15, 20), 3))
c <- seq(0, 1000, by = 1000/14)

DF <- data.frame(a, b, c)

ggplot(DF, aes(x = a, y = b, z = c)) +
  geom_raster(aes(fill = c)) +
  geom_contour() + scale_fill_gradientn(colours = rainbow(10))

我做错了什么,在哪里可以找到有关此地块的更多数据信息?

【问题讨论】:

  • 对于a 的每个值,都应该有b 的所有值。一种可行的方法是使用expand.grid(a = a, b = c(0, 5, 10, 15, 20)),然后生成c
  • @missuse 如何生成c

标签: r plot ggplot2 contour


【解决方案1】:

这是一个例子:

生成坐标:

b = c(0, 5, 10, 15, 20)
a = (1:30)/10

生成所有坐标组合

df <- expand.grid(a, b)

通过 a 和 b+1 的 tcrossprod 生成 c(这完全是任意的,但会生成一个不错的模式)

df$c <- as.vector(a %o% (b+1))

ggplot(df, aes(x = Var1, y = Var2, z = c, fill = c)) +
  geom_raster(interpolate = T) + #interpolate for success 
  scale_fill_gradientn(colours = rainbow(10))

一般来说,如果你有一个值矩阵(z 值)要在 ggplot 中绘制,你需要通过 meltreshape2 中将其转换为长格式,或者在tidyr 中收集,然后用于绘图。

您的数据非常稀疏,解决此问题的一种方法是生成缺失的数据。我将展示如何使用 loess 函数来完成:

model <- loess(c ~ a + b, data = DF) #make a loess model based on the data provided (data in OP)

z <- predict(model, newdata = expand.grid(a = (10:30)/10, b = (0:200)/10)) #predict on the grid data

df <- data.frame(expand.grid(a = (10:30)/10, b = (0:200)/10), c = as.vector(z)) #append z to grid data

ggplot(df, aes(x = a, y = b, z = c, fill = c)) +
  geom_raster(interpolate = T)+
  scale_fill_gradientn(colours = rainbow(10))

【讨论】:

  • 如果我的z向量是c &lt;- seq(0, 1000, by = 1000/14),你能帮我吗
  • 再次编辑,发现上次编辑有错误,c 没有包含正确的数字。
  • 但是,@daniel-valencia-c,请不要使用彩虹配色方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2013-02-17
相关资源
最近更新 更多