R 在facetting上分组选择变量

R 在facetting上分组选择变量,r,ggplot2,R,Ggplot2,给定一个数据帧df,如下所示 text <- " CAR_MODEL,ENGINE_VENDOR,var,value,label Toyota Corolla,FIAT,Three_Family_Pct,33.98,33.98 Nissan Sunny,PRATNEY,Three_Family_Pct,29.84,29.84 Renault Duster,FIAT,Three_Family_Pct,27.86,27.86 Suzuki Ciaz,FIAT,Three_Family_Pct,

给定一个数据帧df,如下所示

text <- "
CAR_MODEL,ENGINE_VENDOR,var,value,label
Toyota Corolla,FIAT,Three_Family_Pct,33.98,33.98
Nissan Sunny,PRATNEY,Three_Family_Pct,29.84,29.84
Renault Duster,FIAT,Three_Family_Pct,27.86,27.86
Suzuki Ciaz,FIAT,Three_Family_Pct,26.6,26.6
Renault Duster,FIAT,Single_Family_Pct,0,0
Toyota Corolla,FIAT,Single_Family_Pct,0,0
Nissan Sunny,PRATNEY,Single_Family_Pct,0,0
Suzuki Ciaz,FIAT,Single_Family_Pct,0,0
Suzuki Ciaz,FIAT,Two_Family_Pct,42.37,42.37
Renault Duster,FIAT,Two_Family_Pct,41.53,41.53
Toyota Corolla,FIAT,Two_Family_Pct,36.31,36.31
Nissan Sunny,PRATNEY,Two_Family_Pct,32.27,32.27
Nissan Sunny,PRATNEY,Four_Family_Pct,37.89,37.89
Suzuki Ciaz,FIAT,Four_Family_Pct,31.03,31.03
Renault Duster,FIAT,Four_Family_Pct,30.61,30.61
Toyota Corolla,FIAT,Four_Family_Pct,29.71,29.71
Nissan Sunny,PRATNEY,Mileage,12688.5,12688
Suzuki Ciaz,FIAT,Mileage,11989,11989
Renault Duster,FIAT,Mileage,11132.5,11132
Toyota Corolla,FIAT,Mileage,10357,10357
"
df <- read.table(textConnection(text), sep=",", header = T)

我得到了上面这样的图表。不过,我希望图表中有两处变化

  • 需要
    里程
    作为最底部的绘图
  • var
    s
    Four\u Family\u Pct
    Three\u Family\u Pct
    Two\u Family\u Pct
    Single\u Family\u Pct
    ,需要以聚集条形图的形式绘制,因为它们属于相同的逻辑属性-它们显示了族类型的百分比
  • 我该怎么做呢


    @PoGibas-添加了一个用于参考的表示(在excel中制作)-X轴标签需要在那里

    像这样的事

    library(tidyverse)
    p1 <- df %>% 
      mutate(var2=ifelse(var =="Mileage", "Mileage","Family types")) %>% 
      mutate(var=factor(var, levels = levels(df$var)[c(1,3:5,2)])) %>% 
      mutate(label2=ifelse(var =="Mileage", scales::comma(label,digits = 0),paste0(label,"%"))) %>% 
      ggplot(aes(x=CAR_MODEL, y=value, fill=var, label = label2))+ 
         geom_col(aes(col=ENGINE_VENDOR),position = position_dodge(width = 0.9), size=1.2) +
         geom_label(position = position_dodge(width = 0.9) ,show.legend = F)+
      scale_color_manual(values = c(1,2))+
      theme(legend.position="top")
    # and the plot using wrap
    p1 + facet_wrap( ~ var2, scales = "free_y", ncol = 1) 
    

    对于网格方法,我将删除
    aes(col=ENGINE\u VENDOR)
    参数

    像这样的

    library(tidyverse)
    p1 <- df %>% 
      mutate(var2=ifelse(var =="Mileage", "Mileage","Family types")) %>% 
      mutate(var=factor(var, levels = levels(df$var)[c(1,3:5,2)])) %>% 
      mutate(label2=ifelse(var =="Mileage", scales::comma(label,digits = 0),paste0(label,"%"))) %>% 
      ggplot(aes(x=CAR_MODEL, y=value, fill=var, label = label2))+ 
         geom_col(aes(col=ENGINE_VENDOR),position = position_dodge(width = 0.9), size=1.2) +
         geom_label(position = position_dodge(width = 0.9) ,show.legend = F)+
      scale_color_manual(values = c(1,2))+
      theme(legend.position="top")
    # and the plot using wrap
    p1 + facet_wrap( ~ var2, scales = "free_y", ncol = 1) 
    


    对于网格方法,我将删除
    aes(col=ENGINE\u VENDOR)
    参数

    不是一个完美的解决方案,但会显示所有需要的信息:

    library(ggplot2)
    
    ggplot(df, aes(CAR_MODEL, value)) +
        geom_rect(aes(xmin = CAR_MODEL, xmax = CAR_MODEL,
                      ymin = -Inf, ymax = Inf,
                      color = ENGINE_VENDOR),
                      size = 60) +
        geom_bar(data = subset(df, var != "Mileage"),
                 aes(fill = var),
                 stat = "identity", position = "dodge", width = 0.6) +
        geom_bar(data = subset(df, var == "Mileage"),
                 stat = "identity", width = 0.2, fill = "grey20") +
        facet_wrap(~ var == "Mileage", ncol = 1, scales = "free") +
        labs(x = NULL,
             y = NULL,
             fill = NULL,
             color = NULL) +
        scale_fill_brewer(palette = "Accent") +
        scale_color_brewer(palette = "Paired") +
        theme_classic() +
        theme(strip.background = element_blank(),
              strip.text.x = element_blank(),
              axis.ticks.x = element_blank(),
              legend.position = "top") +
        guides(colour = guide_legend(override.aes = list(fill = brewer.pal(2, "Paired")[1:2], 
                                                         size = 1)))
    


    使用
    facet\u wrap
    查看里程/非里程信息,使用
    geom\u rect
    查看发动机信息。

    不是完美的解决方案,但会显示所有需要的信息:

    library(ggplot2)
    
    ggplot(df, aes(CAR_MODEL, value)) +
        geom_rect(aes(xmin = CAR_MODEL, xmax = CAR_MODEL,
                      ymin = -Inf, ymax = Inf,
                      color = ENGINE_VENDOR),
                      size = 60) +
        geom_bar(data = subset(df, var != "Mileage"),
                 aes(fill = var),
                 stat = "identity", position = "dodge", width = 0.6) +
        geom_bar(data = subset(df, var == "Mileage"),
                 stat = "identity", width = 0.2, fill = "grey20") +
        facet_wrap(~ var == "Mileage", ncol = 1, scales = "free") +
        labs(x = NULL,
             y = NULL,
             fill = NULL,
             color = NULL) +
        scale_fill_brewer(palette = "Accent") +
        scale_color_brewer(palette = "Paired") +
        theme_classic() +
        theme(strip.background = element_blank(),
              strip.text.x = element_blank(),
              axis.ticks.x = element_blank(),
              legend.position = "top") +
        guides(colour = guide_legend(override.aes = list(fill = brewer.pal(2, "Paired")[1:2], 
                                                         size = 1)))
    


    使用
    facet\u wrap
    查看里程/非里程信息,使用
    geom\u rect
    查看发动机信息。

    需要以聚集条形图的形式绘制:这会在需要填充堆叠条形图时更改整体图。您同意这样的解决方案吗?@PoGibas-在OPS中添加了一个表示以供参考,但该绘图中没有引擎信息。您希望如何显示它?填充已被使用。@PoGibas-需要引擎信息-但是必须有一种方法来指示条形图中的条形图。@user3206440聚集条形图中颜色的含义是什么?为什么会有8个条形图?需要以聚集条形图的形式绘制:当需要填充的堆叠条形图时,这会更改整体绘图。您同意这样的解决方案吗?@PoGibas-在OPS中添加了一个表示以供参考,但该绘图中没有引擎信息。您希望如何显示它?填充已被使用。@PoGibas-需要引擎信息-但是必须有一种方法来指示条形图中的条形图。@user3206440聚集条形图中颜色的含义是什么?为什么有8条?是的,这很接近-需要在顶部绘图中添加图例键,以便指示哪个条是什么。此外,发动机信息可能会添加到底部绘图中。是的,这已关闭-需要在顶部绘图中添加图例键,以便指示哪个栏是什么。发动机信息也可以添加到底部绘图中。是否可以将值标签添加到每个条形图?是否可以将值标签添加到每个条形图?