在 ggplot2 中绘制 position="identity" geom_col - 一些系列隐藏在其他系列后面,即不可见
Plotting position="identity" geom_col in ggplot2 - some series hiding behind others i.e. not visible
我正在尝试以条形图格式绘制年度时间序列。
我有7组年度数据,它们是有顺序的(所以,同一个数据集每年最低值,同一个数据集每年最高值)
我可以把它画成折线图,一切看起来都很好...
但是当我将其绘制为堆叠条形图时,绘制顺序意味着一些条形不可见。我这辈子都不知道如何覆盖它。 factor 和 levels 都试过了,还是破解不了
如果我绘制为 position="dodge" 我可以看到组中较早的几个较小,所以当我使用 position="identity" 时它们是 'behind'(即不可见) ".
在绘制 position="identity" 时是否有从大到小排序的方法?
这段代码创建了一个与我的前几行类似的数据框:
temp2 <- as.data.frame(matrix(1:70, 5, 14))
colnames(temp2) <- c("FY", "B", "L1", "L2", "L3", "L4", "M1", "M2", "M3", "M4",
"H1", "H2", "H3", "H4")
temp2$FY <- 1976:1980
temp2$B <- c(800, 935, 650, 850, 650)
temp2$L1 <- temp2$B * 1.0149
temp2$L2 <- temp2$B * 1.0161
temp2$L3 <- temp2$B * 1.0191
temp2$L4 <- temp2$B * 1.0269
temp2$H1 <- temp2$B * 0.9323
temp2$H2 <- temp2$B * 0.9269
temp2$H3 <- temp2$B * 0.9135
temp2$H4 <- temp2$B * 0.8787
temp2$M1 <- temp2$B * 0.9867
temp2$M2 <- temp2$B * 0.9856
temp2$M3 <- temp2$B * 0.9827
temp2$M4 <- temp2$B * 0.9754
temp2 <- gather(temp2, Type, Rain,
B:H4, factor_key=TRUE)
temp2 <- ddply(temp2, .(FY, Type), summarise,
Rain = sum(Rain, na.rm=TRUE))
那么如果我这样做:
ggplot(temp2, aes(x=FY, y=Rain, colour=Type)) + geom_line()
...我得到一个正常的折线图,您可以在其中看到所有系列。
但是,如果我这样做:
ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="identity")
...然后一些条隐藏在其他条的后面。
ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="dodge")
... 显示第 2、3、4、5 根柱线通常高于第一个柱线,但后 8 根柱线较低。我需要以某种方式重新排序我的数据,方法是按“类型”中的值对我从不同数据帧计算出的预定义顺序进行排序。
希望清楚。
编辑:
(这是使用我的完整数据集,但希望你能理解要点)
position="dodge"
很明显每个“包”有 7 个系列。
但是在 position="identity" 中只出现了 5 个。每张图的轮廓可能会干扰系列之间的微小差异?
position="identity"
您可以使用 forcats::fct_reorder()
按 Rain
对值进行排序。这仅适用于 Type
值在 Year
中处于相同相对顺序的情况。在下面的闪避图中可以最好地看出这一点。
library(ggplot2)
library(plyr)
library(tidyr)
library(forcats)
ggplot(temp2, aes(x = FY, y = Rain,
fill = fct_reorder(Type, Rain),
colour = fct_reorder(Type, Rain))) +
geom_col(position="identity")
ggplot(temp2, aes(x = FY, y = Rain, fill = fct_reorder(Type, Rain))) +
geom_col(position="dodge")
由 reprex package (v2.0.1)
于 2022-05-09 创建
我正在尝试以条形图格式绘制年度时间序列。
我有7组年度数据,它们是有顺序的(所以,同一个数据集每年最低值,同一个数据集每年最高值)
我可以把它画成折线图,一切看起来都很好...
但是当我将其绘制为堆叠条形图时,绘制顺序意味着一些条形不可见。我这辈子都不知道如何覆盖它。 factor 和 levels 都试过了,还是破解不了
如果我绘制为 position="dodge" 我可以看到组中较早的几个较小,所以当我使用 position="identity" 时它们是 'behind'(即不可见) ".
在绘制 position="identity" 时是否有从大到小排序的方法?
这段代码创建了一个与我的前几行类似的数据框:
temp2 <- as.data.frame(matrix(1:70, 5, 14))
colnames(temp2) <- c("FY", "B", "L1", "L2", "L3", "L4", "M1", "M2", "M3", "M4",
"H1", "H2", "H3", "H4")
temp2$FY <- 1976:1980
temp2$B <- c(800, 935, 650, 850, 650)
temp2$L1 <- temp2$B * 1.0149
temp2$L2 <- temp2$B * 1.0161
temp2$L3 <- temp2$B * 1.0191
temp2$L4 <- temp2$B * 1.0269
temp2$H1 <- temp2$B * 0.9323
temp2$H2 <- temp2$B * 0.9269
temp2$H3 <- temp2$B * 0.9135
temp2$H4 <- temp2$B * 0.8787
temp2$M1 <- temp2$B * 0.9867
temp2$M2 <- temp2$B * 0.9856
temp2$M3 <- temp2$B * 0.9827
temp2$M4 <- temp2$B * 0.9754
temp2 <- gather(temp2, Type, Rain,
B:H4, factor_key=TRUE)
temp2 <- ddply(temp2, .(FY, Type), summarise,
Rain = sum(Rain, na.rm=TRUE))
那么如果我这样做:
ggplot(temp2, aes(x=FY, y=Rain, colour=Type)) + geom_line()
...我得到一个正常的折线图,您可以在其中看到所有系列。 但是,如果我这样做:
ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="identity")
...然后一些条隐藏在其他条的后面。
ggplot(temp2, aes(x=FY, y=Rain, fill=Type)) + geom_col(position="dodge")
... 显示第 2、3、4、5 根柱线通常高于第一个柱线,但后 8 根柱线较低。我需要以某种方式重新排序我的数据,方法是按“类型”中的值对我从不同数据帧计算出的预定义顺序进行排序。
希望清楚。
编辑: (这是使用我的完整数据集,但希望你能理解要点) position="dodge"
很明显每个“包”有 7 个系列。
但是在 position="identity" 中只出现了 5 个。每张图的轮廓可能会干扰系列之间的微小差异? position="identity"
您可以使用 forcats::fct_reorder()
按 Rain
对值进行排序。这仅适用于 Type
值在 Year
中处于相同相对顺序的情况。在下面的闪避图中可以最好地看出这一点。
library(ggplot2)
library(plyr)
library(tidyr)
library(forcats)
ggplot(temp2, aes(x = FY, y = Rain,
fill = fct_reorder(Type, Rain),
colour = fct_reorder(Type, Rain))) +
geom_col(position="identity")
ggplot(temp2, aes(x = FY, y = Rain, fill = fct_reorder(Type, Rain))) +
geom_col(position="dodge")
由 reprex package (v2.0.1)
于 2022-05-09 创建