我已经搜索过这个答案,但我找不到它。我只想显示 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"))
})