如何使用不平衡数据(x 轴上的 NA)更改 ggplot 中离散 x 刻度的顺序
how to change the order of a discrete x scale in ggplot with unbalenced data (NA on the x-axis)
我正在尝试绘制误差线的分面 ggplot2 图,但失败了。数据大概是这样的...
library(ggplot2)
library(dplyr)
df0 <- iris %>%
group_by(Species) %>%
mutate(long_sepal = ifelse(Sepal.Length > mean(Sepal.Length),
yes = "long", no = "short")) %>%
group_by(Species, long_sepal) %>%
mutate(petal_rank = order(Petal.Width)) %>%
filter(petal_rank <= 5) %>%
mutate(petal_rank = factor(petal_rank))
> df0
# Source: local data frame [30 x 7]
# Groups: Species, long_sepal [6]
#
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species long_sepal petal_rank
# (dbl) (dbl) (dbl) (dbl) (fctr) (chr) (int)
# 1 5.4 3.9 1.7 0.4 setosa long 1
# 2 4.6 3.4 1.4 0.3 setosa short 1
# 3 5.0 3.4 1.5 0.2 setosa short 2
# 4 4.4 2.9 1.4 0.2 setosa short 3
# 5 4.9 3.1 1.5 0.1 setosa short 4
# 6 5.4 3.7 1.5 0.2 setosa long 3
# 7 5.8 4.0 1.2 0.2 setosa long 4
# 8 5.2 4.1 1.5 0.1 setosa long 2
# 9 5.5 4.2 1.4 0.2 setosa long 5
# 10 4.5 2.3 1.3 0.3 setosa short 5
# .. ... ... ... ... ... ... ...
我可以使用 scale_x_discrete
函数根据需要对离散轴进行排序(即首先 short
,在下面的绘图代码中取消注释)。但是,我的数据有一些组,其中 x 轴上的变量没有分类,所以更像是:
df0 <- df0 %>%
ungroup() %>%
mutate(long_sepal = ifelse(Species != "virginica", yes = long_sepal, no = NA),
long_sepal = factor(long_sepal))
情节代码给出了 x 轴上的 NA
,我想避免...
ggplot(data = df0,
aes(x = long_sepal, y = Petal.Width, group = factor(petal_rank),
ymin = Petal.Width-0.05,
ymax = Petal.Width+0.05)) +
geom_pointrange(position = position_dodge(width = 0.4)) +
facet_wrap(~ Species, scales = "free") # + scale_x_discrete(limits=c("short", "long"))
... 或当我取消注释 scale_x_discrete
函数时出现错误消息;
Error in if (zero_range(from) || zero_range(to)) { :
missing value where TRUE/FALSE needed
无论如何,是否可以使用离散值的指定顺序进行绘图,并且在没有 x 轴分类的方面没有 NA
标签?
如果您将 x
映射到 long_sepal
的分解版本,您可以更改顺序,但这不会消除 NA
;您还需要 scale_x_discrete
。不过,您需要设置 breaks
,而不是 limits
:
ggplot(data = df0,
aes(x = factor(long_sepal, levels = c('short', 'long')),
y = Petal.Width, group = factor(petal_rank),
ymin = Petal.Width-0.05,
ymax = Petal.Width+0.05)) +
geom_pointrange(position = position_dodge(width = 0.4)) +
facet_wrap(~ Species, scales = "free") +
scale_x_discrete(breaks = c("short", "long"))
请注意 factor
方法搞砸了主 x 标签,但无论如何您可能想用 xlab
或诸如此类的东西来设置它。此外,如果这是一个问题,您会丢失 NA
垂直网格线。
我正在尝试绘制误差线的分面 ggplot2 图,但失败了。数据大概是这样的...
library(ggplot2)
library(dplyr)
df0 <- iris %>%
group_by(Species) %>%
mutate(long_sepal = ifelse(Sepal.Length > mean(Sepal.Length),
yes = "long", no = "short")) %>%
group_by(Species, long_sepal) %>%
mutate(petal_rank = order(Petal.Width)) %>%
filter(petal_rank <= 5) %>%
mutate(petal_rank = factor(petal_rank))
> df0
# Source: local data frame [30 x 7]
# Groups: Species, long_sepal [6]
#
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species long_sepal petal_rank
# (dbl) (dbl) (dbl) (dbl) (fctr) (chr) (int)
# 1 5.4 3.9 1.7 0.4 setosa long 1
# 2 4.6 3.4 1.4 0.3 setosa short 1
# 3 5.0 3.4 1.5 0.2 setosa short 2
# 4 4.4 2.9 1.4 0.2 setosa short 3
# 5 4.9 3.1 1.5 0.1 setosa short 4
# 6 5.4 3.7 1.5 0.2 setosa long 3
# 7 5.8 4.0 1.2 0.2 setosa long 4
# 8 5.2 4.1 1.5 0.1 setosa long 2
# 9 5.5 4.2 1.4 0.2 setosa long 5
# 10 4.5 2.3 1.3 0.3 setosa short 5
# .. ... ... ... ... ... ... ...
我可以使用 scale_x_discrete
函数根据需要对离散轴进行排序(即首先 short
,在下面的绘图代码中取消注释)。但是,我的数据有一些组,其中 x 轴上的变量没有分类,所以更像是:
df0 <- df0 %>%
ungroup() %>%
mutate(long_sepal = ifelse(Species != "virginica", yes = long_sepal, no = NA),
long_sepal = factor(long_sepal))
情节代码给出了 x 轴上的 NA
,我想避免...
ggplot(data = df0,
aes(x = long_sepal, y = Petal.Width, group = factor(petal_rank),
ymin = Petal.Width-0.05,
ymax = Petal.Width+0.05)) +
geom_pointrange(position = position_dodge(width = 0.4)) +
facet_wrap(~ Species, scales = "free") # + scale_x_discrete(limits=c("short", "long"))
... 或当我取消注释 scale_x_discrete
函数时出现错误消息;
Error in if (zero_range(from) || zero_range(to)) { :
missing value where TRUE/FALSE needed
无论如何,是否可以使用离散值的指定顺序进行绘图,并且在没有 x 轴分类的方面没有 NA
标签?
如果您将 x
映射到 long_sepal
的分解版本,您可以更改顺序,但这不会消除 NA
;您还需要 scale_x_discrete
。不过,您需要设置 breaks
,而不是 limits
:
ggplot(data = df0,
aes(x = factor(long_sepal, levels = c('short', 'long')),
y = Petal.Width, group = factor(petal_rank),
ymin = Petal.Width-0.05,
ymax = Petal.Width+0.05)) +
geom_pointrange(position = position_dodge(width = 0.4)) +
facet_wrap(~ Species, scales = "free") +
scale_x_discrete(breaks = c("short", "long"))
请注意 factor
方法搞砸了主 x 标签,但无论如何您可能想用 xlab
或诸如此类的东西来设置它。此外,如果这是一个问题,您会丢失 NA
垂直网格线。