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