重新排序绘图中的重叠条,以便较长的条在后面 -R
Reorder Overlaid Bars in Plot so Longer Bars are in back -R
我有一个要叠加的条形图。问题是较长的条覆盖较短的条。 excel 中有一个函数允许将较长的条推到后面,将较短的条推到最前面。我如何在 R 中做到这一点?
我的代码如下:
ggplot(df2) +geom_bar(aes(x = id, y = `Feb-20`), position = "identity",stat="identity", fill = 'green') +
geom_bar(aes(x = id, y = `Mar-20`), position = "identity", stat="identity",fill = 'navy') +
geom_bar(aes(x = id, y = `Apr-20`), position = "identity", stat="identity", fill = 'red')
并生成此图表:
现在,我看到了一些通过改变透明度来解决这个问题的方法。由于我有三个因素,所以更改 alpha 不是很清楚:
如何更改条形图的叠加顺序,使较长的条形图在后面?
如果您要绘制条形图,我建议您切换到 geom_col
,但提供 x=
和 y=
美学。 See here for the documentation explanation。话虽如此,它会以任何一种方式工作。基本上:
Tidy Data:我无法确认,但您的数据集 df2
似乎没有按照 Tidy Data Principles 组织,这使得使用 ggplot2
和许多其他数据分析方法,事情就容易多了。不要让你的 y 值在 df2$Mar-20
和 df2$Apr-20
之间拆分,你应该有一列用于类别(我们称之为 df2$date
)和一列用于实际值 df2$y
.然后你会接到一个 geom_bar
的电话,给出 aes(x=id, y=y)
。您可以通过 reshape2
包中的 dplyr::gather()
或 melt
执行此操作。
排列数据: 在任何其他影响(例如因子水平的排序)之外,ggplot2
中的绘图函数将根据 x=
和 y=
美学的实际数据框的排列绘制数据。这意味着如果您预先根据特定的非因子值对数据进行排序,这将决定 ggplot2
绘制的顺序。因此,您应该在绘图之前根据降序 df2$y
对绘图进行排序,以使最大的条形图最先绘制,最小的条形图最后绘制,这意味着最小的将在前面。
这是一个包含虚拟数据的完整示例:
library(ggplot2)
library(dplyr)
set.seed(1234)
df <- data.frame(
x=rep(LETTERS[1:10],3),
y=sample(1:100,30,replace=TRUE),
id=c(rep('Group1',10),rep('Group2',10),rep('Group3',10))
)
df %>%
arrange(-y) %>%
ggplot(aes(x,y)) + theme_bw() +
geom_bar(aes(fill=id),stat='identity',position=position_identity())
尝试不使用 arrange()
函数的 ggplot()
函数,您会发现效果就是您想要的。
我有一个要叠加的条形图。问题是较长的条覆盖较短的条。 excel 中有一个函数允许将较长的条推到后面,将较短的条推到最前面。我如何在 R 中做到这一点?
我的代码如下:
ggplot(df2) +geom_bar(aes(x = id, y = `Feb-20`), position = "identity",stat="identity", fill = 'green') +
geom_bar(aes(x = id, y = `Mar-20`), position = "identity", stat="identity",fill = 'navy') +
geom_bar(aes(x = id, y = `Apr-20`), position = "identity", stat="identity", fill = 'red')
并生成此图表:
现在,我看到了一些通过改变透明度来解决这个问题的方法。由于我有三个因素,所以更改 alpha 不是很清楚:
如何更改条形图的叠加顺序,使较长的条形图在后面?
如果您要绘制条形图,我建议您切换到 geom_col
,但提供 x=
和 y=
美学。 See here for the documentation explanation。话虽如此,它会以任何一种方式工作。基本上:
Tidy Data:我无法确认,但您的数据集
df2
似乎没有按照 Tidy Data Principles 组织,这使得使用ggplot2
和许多其他数据分析方法,事情就容易多了。不要让你的 y 值在df2$Mar-20
和df2$Apr-20
之间拆分,你应该有一列用于类别(我们称之为df2$date
)和一列用于实际值df2$y
.然后你会接到一个geom_bar
的电话,给出aes(x=id, y=y)
。您可以通过reshape2
包中的dplyr::gather()
或melt
执行此操作。排列数据: 在任何其他影响(例如因子水平的排序)之外,
ggplot2
中的绘图函数将根据x=
和y=
美学的实际数据框的排列绘制数据。这意味着如果您预先根据特定的非因子值对数据进行排序,这将决定ggplot2
绘制的顺序。因此,您应该在绘图之前根据降序df2$y
对绘图进行排序,以使最大的条形图最先绘制,最小的条形图最后绘制,这意味着最小的将在前面。
这是一个包含虚拟数据的完整示例:
library(ggplot2)
library(dplyr)
set.seed(1234)
df <- data.frame(
x=rep(LETTERS[1:10],3),
y=sample(1:100,30,replace=TRUE),
id=c(rep('Group1',10),rep('Group2',10),rep('Group3',10))
)
df %>%
arrange(-y) %>%
ggplot(aes(x,y)) + theme_bw() +
geom_bar(aes(fill=id),stat='identity',position=position_identity())
尝试不使用 arrange()
函数的 ggplot()
函数,您会发现效果就是您想要的。