0

我已经搜索过这个答案,但我找不到它。我只想显示 ggplot barplot 的第一个 X 元素,只编码到 ggplot 本身。让我进一步解释一下。我有一个数据集,列出了一个城市的居民人数,每年(1999-2018 年)、性别、公民身份和城市的季度/区域。我选择一年和一个公民身份,然后绘制每个季度的居民数量(y 轴,性别男性/女性的堆叠条),按居民数量排序。

这是一个示例: 绘制每个季度的居民,“阿富汗”,2018 年

我只是喜欢减少到第一个 X(例如 10)条。我必须将代码插入到 Shinyapp 中,所以我试图在下面的“操作”函数中的代码中直接插入指令。有没有办法在 aes/reorder 函数中做到这一点(见下面的代码)?

这是代码,我尝试(但没有成功)使用“子集”功能来减少否。居民(按季度,但对性别进行分组,即我想保留女性为 8 岁,男性为 7 岁的四分之一)。

非常感谢!

p10 <- manipulate(
  ggplot(subset(df_tothab_STR_citt[df_tothab_STR_citt$Y==YearList &
                              df_tothab_STR_citt$Citt==CittList,]), 
         aes(x = reorder(Nil, Residenti, FUN = sum),
             y = Residenti,
             group = Gen,
             fill = Gen)) + 
    geom_bar(stat = "identity") +
    scale_fill_brewer(palette = "Set1") +
    ggtitle(paste(CittList, "-", YearList)) +
    coord_flip() +
    labs(fill="Gender", x="Nil", y="Resident") +
    theme_bw(),
  CittList = picker(
    as.list(unique(as.character(df_tothab_STR_citt$Citt)))),
  YearList = picker(
    as.list(unique(as.character(sort(df_tothab_STR_citt$Y)))))
)

这也是数据集的“head”和“str”。

head(df_tothab_STR_citt)
     Y                    Nil     Gen        Citt Residenti
1 2018                 Baggio Femmine Afghanistan         2
2 1999             Bande Nere Femmine Afghanistan         1
3 2000             Bande Nere Femmine Afghanistan         1
4 2001             Bande Nere Femmine Afghanistan         1
5 2002             Bande Nere Femmine Afghanistan         1
6 2014 Buenos Aires - Venezia Femmine Afghanistan         1
str(df_tothab_STR_citt)
'data.frame':   196703 obs. of  5 variables:
 $ Y        : int  2018 1999 2000 2001 2002 2014 2016 2017 2018 2012 ...
 $ Nil      : chr  "Baggio" "Bande Nere" "Bande Nere" "Bande Nere" ...
 $ Gen      : Factor w/ 2 levels "Femmine","Maschi": 1 1 1 1 1 1 1 1 1 1 ...
 $ Citt     : chr  "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ Residenti: int  2 1 1 1 1 1 1 1 1 3 ...

-------- 编辑 ------------- 为了完整起见,我在这里发布了我在 Shiny 应用程序中所做的工作,以使其适用于我的图表之一在应用程序中绘图。

基本上,“反应式”函数根据来自滑块或选择输入的 input$something 计算 df13_react。然后 renderPlot/ggplot 仅根据比率范围过滤计算结果(同样,从 0 到 100% 之间的最小/最大滑块)

我对操作函数所做的是在 ShinyApp 之外重现相同的行为,仅用于测试它而不必每次都重新加载应用程序。

此致。

  # PLOT13:
  output$t13 <- renderText({
    "Citizens (ITA/STR) by Nil, gender (M/F) and year (selectable)"
  })

  df13_react <- reactive({
    df13 <- df_tothab[df_tothab$Y==input$YearList,]
    # df13Nil <- unique(df_tothab$Nil[df_tothab$Residenti>input$minRes13])

    df13agg <- aggregate(df13$Residenti,
                         by=list(Nil=df13$Nil, Cittadinanza=df13$Citt),
                         FUN=sum)
    colnames(df13agg)[3]<-"Residenti"
    df13agg <- dcast(df13agg, Nil ~ Cittadinanza, value.var="Residenti")
    df13agg[is.na(df13agg)] <- 0
    df13agg$Ratio <- df13agg$STR / (df13agg$STR+df13agg$ITA)
    df13agg[is.na(df13agg)] <- 0
    df13$Ratio <- NA

    addRatio <- function (df13, df13agg){
      vRatio <- rep(0, length(df13$Ratio))
      for(i in 1:length(df13$Ratio)){
        vRatio[i] <- df13agg$Ratio[df13agg$Nil==df13$Nil[i]]
      }
      vRatio
    }
    df13$Ratio <- addRatio(df13, df13agg)
    return(df13)
  })

  output$p13 <- renderPlot({
    df13 <- df13_react()
    ggplot(df13[df13$Ratio >= input$minRatio13 / 100 &
                  df13$Ratio <= input$maxRatio13 / 100,],
           aes(x = reorder(Nil, Ratio),
               y = Residenti,
               group = interaction(Gen, Cittadinanza),
               fill = interaction(Gen, Cittadinanza))) + 
      geom_bar(stat = "identity", position = "fill") +
      scale_fill_manual(values=c("red","green",
                                 "blue","turquoise4")) +
      ggtitle(paste(input$YearList)) +
      labs(fill="Legend", x=NULL, y="Resident") +
      scale_y_continuous(labels = scales::percent_format(accuracy = 5L),
                         breaks = c(seq(0, 1, 0.1))) +
      coord_flip() +
      theme(panel.ontop = TRUE,
            panel.background = element_blank(),
            panel.grid = element_line(colour = "black"))
  })
4

1 回答 1

0

看起来你已经生成了你想要的图的代码,所以你只是在寻找一种方法来减少观察次数成为“前 X”,对吗?

对此的简单答案可能是首先(1)对您的数据框进行排序(从您的数据外观中通过“Residenti”),然后(2)通过head(df, x).

所以像:

sorted.df <- your.df[order(Residenti, decreasing = TRUE),]
ggplot(data=subset(head(sorted.df, top.X)), aes(...)) + ...
于 2020-04-20T13:43:39.703 回答