如何使用离散轴从ggplot中删除x值?

时间:2020-05-22 23:02:13

标签: r ggplot2 geom-bar

这可能是一个简单的解决方法。

我正在创建一个新的闪亮的仪表板,并且我的公司要求所有地块按列表排序。因此,很自然地我创建了一个列表并使用了scale_x_discrete(limits = list)。但是,现在要求的是要删除等于零的值,同时仍保留列表的顺序。这可能与scale_x_discrete()有关吗?​​

即生成的图将在保持names <- c("before", "same", "different")顺序的同时排除变量“ 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) 

3 个答案:

答案 0 :(得分:3)

当您通过限制时,您只需对名称进行子集化:

ggplot(df, aes(names, values))+
  geom_bar(stat = "identity")+
  scale_x_discrete(limits = names[values>0])

答案 1 :(得分:2)

您可以编程一个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)

答案 2 :(得分:2)

请确保您可以通过预先准备数据和向量来实现此目的,但是在这种情况下您应该应该做什么:使用有序因子:

# 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() 
相关问题