Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用0上方和下方的不同颜色填充曲线下方/上方的区域?_R_Ggplot2 - Fatal编程技术网

R 如何使用0上方和下方的不同颜色填充曲线下方/上方的区域?

R 如何使用0上方和下方的不同颜色填充曲线下方/上方的区域?,r,ggplot2,R,Ggplot2,我想绘制一个标准化降水指数(SPI)的时间序列。通常这看起来有点像这样: 可以看到曲线下方/上方的区域以蓝色/红色显示。这也是我想策划的 我知道也有类似的问题,比如和一个。这可能会带来更进一步的结果,但不幸的是还没有达到最终结果 为了便于理解,以下是一些代码,以便每个人都可以复制: library(data.table) library(ggplot2) vec1 <- 1:310 vec2 <- c(1.78, 1.88, 1.10, 0.42, 0.73, 1.35,

我想绘制一个标准化降水指数(SPI)的时间序列。通常这看起来有点像这样:

可以看到曲线下方/上方的区域以蓝色/红色显示。这也是我想策划的

我知道也有类似的问题,比如和一个。这可能会带来更进一步的结果,但不幸的是还没有达到最终结果

为了便于理解,以下是一些代码,以便每个人都可以复制:

library(data.table)
library(ggplot2)

vec1 <- 1:310
vec2 <- c(1.78, 1.88,  1.10,  0.42,  0.73,  1.35,  1.34,  0.54,  0.20,  0.72,  1.29,  1.78,  1.30,  1.37, -0.13,  0.64, -0.13,  0.87,  0.47, -0.26, -0.27,
          -0.81, -0.54, -0.77, -0.29, -0.22, -0.05,  0.41,  0.45,  0.91, -0.31,  0.67,  0.28,  0.93,  0.43, -0.04, -0.80, -1.20, -0.73, -0.98,  0.47, -0.01,
          1.30,  1.45,  0.72, -0.59, -1.14, -0.33,  0.22,  0.49,  0.58,  0.36,  0.66,  0.64,  0.47, -0.60,  1.01,  1.50,  1.18,  0.82,  0.02,  0.57,  0.25, 
          1.20,  1.19,  0.71, -0.30, -1.37, -1.50, -1.03, -0.77, -1.08, -1.92, -2.32, -2.46, -1.61, -0.39,  0.67,  0.38,  0.62, -0.34,  0.01, -0.55, -0.74,
          -1.95, -1.18, -0.96,  0.36, -0.96, -1.28, -2.29, -2.67, -0.65, -0.13,  0.61,  0.21,  0.57,  0.11,  0.37,  0.20, -0.14, -0.87, -0.84,  0.87,  1.33,
          0.45, -0.76, -1.27, -0.65, -0.29,  0.54,  0.14, -0.55, -0.94, -0.98, -0.44, -0.37,  0.72,  0.70,  0.95,  0.89,  1.10,  1.51,  1.11,  1.77,  1.20,
          1.23, -0.72, -1.43, -2.11, -1.37, -0.80, -0.34, -0.14,  0.22, -0.65, -0.44, -0.86, -0.46, -0.67, -0.91, -0.40, -0.09,  0.22,  0.96,  0.71,  0.51,
          -1.61, -1.62, -1.43, -0.27,  1.08,  1.76,  1.30,  0.78,  1.02,  1.01,  0.56, -0.32,  0.37,  0.31,  1.36,  1.49,  1.42,  0.78, -0.19,  0.64,  0.39,
          0.47, -1.13, -1.45, -0.52,  0.43, -0.19, -0.97, -0.27,  0.63,  1.01,  1.01,  0.83, -0.56, -1.71, -0.29,  1.06,  1.82,  1.28,  0.88,  1.08,  1.78,
          1.47,  0.74, -0.34,  0.14,  1.09,  1.49,  1.30,  0.28, -0.25,  0.24, -0.33,  0.05, -0.86, -0.69, -1.03, -0.59,  0.32,  0.61,  0.84, -0.18, -0.67,
          0.46,  0.31, -0.72, -2.26, -2.85, -0.69, -0.77,  0.64, -1.49, -1.69, -1.55, -0.28, -0.80, -1.15, -0.38,  0.31,  0.18, -0.27, -0.84, -0.94, -1.23,
          -0.53, -1.52, -0.73, -0.93,  0.25, -0.11,  0.38,  0.48,  0.10, -0.02,  0.26,  1.39,  1.61,  0.83,  0.09,  0.95,  1.07,  0.77,  0.23,  0.26,  0.85,
          0.93,  0.91,  1.10,  0.47,  0.74,  1.42,  1.17,  0.32, -0.40,  0.76,  1.44,  1.69,  1.03,  0.01,  0.46,  0.61,  0.60, -0.09, -0.31, -0.96, -0.91,
          -0.06,  0.75,  1.32,  1.29,  0.55,  0.43, -1.25,  0.12, -0.05,  0.18, -0.77, -2.19, -1.85, -2.12, -1.51, -1.14, -0.79, -0.82, -1.13, -1.72, -2.14,
          -1.95, -0.63,  0.70,  0.64,  0.17, -1.04, -0.58, -0.57, -0.57, -1.05, -1.11, -0.59, -0.07,  1.22,  0.30, -0.15)

df <- data.frame(vec1, vec2)
colnames(df) <- c("ID", "SPI")

df = as.data.table(df)
代码将导致此图像:

您可以看到,单个值之间没有空白,我完全不知道是什么导致了这些错误


有人知道如何解决这个问题吗?

OP,您观察到的是与图形驱动程序的分辨率和列之间的间距相关的伪影。显示的区域由x轴上相邻的许多填充列组成。您没有为
geom_col()
指定
width=
参数,因此默认值在x轴上的各个值之间留有一个空格。最好说明我们是否仅沿x轴获取一部分数据:

ggplot(data = df, aes(x = ID, y = SPI)) +
  geom_col(data = df[SPI <= 0], fill = "red") +
  geom_col(data = df[SPI >= 0], fill = "blue") +
  theme_bw() +
  xlim(0,100)  # just the first part on the left

如果更改列之间的距离怎么办? 刚刚在ggplot的“aes”中添加了“宽度=1”

ggplot(data = df, aes(x = ID, y = SPI, width=1)) +
  geom_col(data = df[SPI <= 0], fill = "red") +
  geom_col(data = df[SPI >= 0], fill = "blue") +
  theme_bw()
ggplot(数据=df,aes(x=ID,y=SPI,宽度=1))+
几何坐标(数据=df[SPI=0],fill=“蓝色”)+
主题_bw()
我明白了:


非常感谢您的快速回答。现在结果看起来很好,几乎完全符合我的要求!我现在应用了这段代码:ggplot(data=df,aes(x=ID,y=SPI))+geom_col(data=df[SPI=0],fill=“blue”,width=1)+theme_bw()。现在唯一剩下的是,与我上面显示的第一张和第三张图片相比,它看起来有点太像单个柱了。有没有办法改变这一点,使其更加平滑?您必须使用
geom_area
对其进行建模,然后根据y轴的值应用不同的
fill
美学。这将不像看上去那么简单,因为每当符号改变时,并不总是有y=0点。您还可以通过在数据集中的每个点之间插入值来“伪造”它。你甚至可以这样做几次,使它们之间的路径更平滑,然后仍然使用
geom\u col()
对数据建模。老实说,这听起来很复杂,目前我不知道如何做。谢谢你的提示。结果与chemdork123的答案基本相同。这样代码就短了一点。
ggplot(data = df, aes(x = ID, y = SPI)) +
  geom_col(data = df[SPI <= 0], fill = "red") +
  geom_col(data = df[SPI >= 0], fill = "blue") +
  theme_bw() +
  xlim(0,100)  # just the first part on the left
ggplot(data = df, aes(x = ID, y = SPI)) +
  geom_col(data = df[SPI <= 0], fill = "red", width=1) +
  geom_col(data = df[SPI >= 0], fill = "blue", width=1) +
  theme_bw() +
  xlim(0,100)
ggplot(data = df, aes(x = ID, y = SPI, width=1)) +
  geom_col(data = df[SPI <= 0], fill = "red") +
  geom_col(data = df[SPI >= 0], fill = "blue") +
  theme_bw()