如何使用离散轴从 ggplot 中删除 x 值?
How to drop x value from ggplot with discrete axis?
这可能是一个简单的解决方法。
我正在用 shiny 创建一个新的仪表板,我的公司要求所有绘图都按列表排序。所以很自然地我创建了一个列表并使用了 scale_x_discrete(limits = list)
。但是,现在要求的是删除等于零的值,同时仍保留列表的顺序。这可能与 scale_x_discrete()
相关吗?
即生成的图将排除变量 "different",同时保持 names <- c("before", "same", "different")
.
的顺序
非常感谢任何帮助,下面是一个可重现的示例。
# packages ----------------------------------------------------------------
{
library(dplyr)
library(ggplot2)
}
# Data --------------------------------------------------------------------
names <- c("before", "same", "different")
values <- c(7, 90, 0)
df <- data.frame(names, values)
# ggplot ------------------------------------------------------------------
ggplot(df, aes(names, values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = names)
您可以编写一个 for 循环,删除您实际上不想在绘图中显示的数据框行。
# packages ----------------------------------------------------------------
{
library(dplyr)
library(ggplot2)
}
# Data --------------------------------------------------------------------
names <- c("before", "same", "different")
values <- c(7, 90, 0)
df <- data.frame(names, values)
#Remove empty categories
for(i in 1:length(values))
{
if(values[i] == 0)
{
df <- df[-c(i),]
}
}
# ggplot ------------------------------------------------------------------
ggplot(df, aes(df$names, df$values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = df$names)
你当然可以通过事先准备数据和向量来实现这一点,但在这种情况下你应该做的是:使用有序因子:
# ggplot ------------------------------------------------------------------
relevant_df <- df %>%
filter(values != 0)
relevant_df %>%
ggplot(aes(names, values)) +
geom_bar(stat = "identity") +
scale_x_discrete(limits = relevant_df$names)
# with ordered factor ----------------------------------------------------------
df %>%
# little bit of confusion here with vector and variable name
# but just define your desired order in the second argument
mutate(names = ordered(names, names)) %>%
filter(values != 0) %>%
ggplot(aes(names, values)) +
geom_bar(stat = "identity") +
scale_x_discrete()
当你传入限制时,你只需对名称进行子集化:
ggplot(df, aes(names, values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = names[values>0])
这可能是一个简单的解决方法。
我正在用 shiny 创建一个新的仪表板,我的公司要求所有绘图都按列表排序。所以很自然地我创建了一个列表并使用了 scale_x_discrete(limits = list)
。但是,现在要求的是删除等于零的值,同时仍保留列表的顺序。这可能与 scale_x_discrete()
相关吗?
即生成的图将排除变量 "different",同时保持 names <- c("before", "same", "different")
.
非常感谢任何帮助,下面是一个可重现的示例。
# packages ----------------------------------------------------------------
{
library(dplyr)
library(ggplot2)
}
# Data --------------------------------------------------------------------
names <- c("before", "same", "different")
values <- c(7, 90, 0)
df <- data.frame(names, values)
# ggplot ------------------------------------------------------------------
ggplot(df, aes(names, values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = names)
您可以编写一个 for 循环,删除您实际上不想在绘图中显示的数据框行。
# packages ----------------------------------------------------------------
{
library(dplyr)
library(ggplot2)
}
# Data --------------------------------------------------------------------
names <- c("before", "same", "different")
values <- c(7, 90, 0)
df <- data.frame(names, values)
#Remove empty categories
for(i in 1:length(values))
{
if(values[i] == 0)
{
df <- df[-c(i),]
}
}
# ggplot ------------------------------------------------------------------
ggplot(df, aes(df$names, df$values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = df$names)
你当然可以通过事先准备数据和向量来实现这一点,但在这种情况下你应该做的是:使用有序因子:
# ggplot ------------------------------------------------------------------
relevant_df <- df %>%
filter(values != 0)
relevant_df %>%
ggplot(aes(names, values)) +
geom_bar(stat = "identity") +
scale_x_discrete(limits = relevant_df$names)
# with ordered factor ----------------------------------------------------------
df %>%
# little bit of confusion here with vector and variable name
# but just define your desired order in the second argument
mutate(names = ordered(names, names)) %>%
filter(values != 0) %>%
ggplot(aes(names, values)) +
geom_bar(stat = "identity") +
scale_x_discrete()
当你传入限制时,你只需对名称进行子集化:
ggplot(df, aes(names, values))+
geom_bar(stat = "identity")+
scale_x_discrete(limits = names[values>0])