[英]Order of stacked bar charts differ between ggplot2 and ggiraph
I'm building a shiny app that prepares a stacked bar chart with a tooltip showing levels of satisfactions across 3 items and 2 types of respondents. 我正在构建一个闪亮的应用程序,该应用程序会准备一个堆积的条形图,并带有工具提示,显示3个项目和2种类型的受访者的满意度。 Here's the data that makes up the chart: 以下是构成图表的数据:
mydf <- structure(list(Resp = structure(c(1L, 1L, 2L, 1L, 2L, 1L, 1L,
2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L), .Label = c("Resp_A",
"Resp_B"), class = "factor"), Rating = structure(c(4L, 4L, 4L,
4L, 4L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L,
1L), .Label = c("DK/NA", "Dissatisfied", "Neutral", "Satisfied"
), class = "factor"), Question = structure(c(1L, 2L, 2L, 3L,
3L, 1L, 2L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 3L
), .Label = c("q14", "q12", "q11"), class = "factor"), count = c(29,
27, 11, 25, 12, 9, 12, 3, 9, 5, 3, 2, 11, 5, 8, 4, 4, 8, 6, 8
), prop = c(0.644444444444444, 0.6, 0.333333333333333, 0.555555555555556,
0.363636363636364, 0.2, 0.266666666666667, 0.0909090909090909,
0.2, 0.151515151515152, 0.0666666666666667, 0.0444444444444444,
0.333333333333333, 0.111111111111111, 0.242424242424242, 0.0888888888888889,
0.0888888888888889, 0.242424242424242, 0.133333333333333, 0.242424242424242
), Label = structure(c(1L, 2L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 3L,
1L, 2L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 3L), .Label = c("Label_1",
"Label_2", "Label_3"), class = "factor"), tooltip = c("<b>Satisfied</b>\n<b>Question:</b> Question_Text_1\n<b>n=</b> 29\n<b>Percentage:</b> 64%",
"<b>Satisfied</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 27\n<b>Percentage:</b> 60%",
"<b>Satisfied</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 11\n<b>Percentage:</b> 33%",
"<b>Satisfied</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 25\n<b>Percentage:</b> 56%",
"<b>Satisfied</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 12\n<b>Percentage:</b> 36%",
"<b>Neutral</b>\n<b>Question:</b> Question_Text_1\n<b>n=</b> 9\n<b>Percentage:</b> 20%",
"<b>Neutral</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 12\n<b>Percentage:</b> 27%",
"<b>Neutral</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 3\n<b>Percentage:</b> 9%",
"<b>Neutral</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 9\n<b>Percentage:</b> 20%",
"<b>Neutral</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 5\n<b>Percentage:</b> 15%",
"<b>Dissatisfied</b>\n<b>Question:</b> Question_Text_1\n<b>n=</b> 3\n<b>Percentage:</b> 7%",
"<b>Dissatisfied</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 2\n<b>Percentage:</b> 4%",
"<b>Dissatisfied</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 11\n<b>Percentage:</b> 33%",
"<b>Dissatisfied</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 5\n<b>Percentage:</b> 11%",
"<b>Dissatisfied</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 8\n<b>Percentage:</b> 24%",
"<b>DK/NA</b>\n<b>Question:</b> Question_Text_1\n<b>n=</b> 4\n<b>Percentage:</b> 9%",
"<b>DK/NA</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 4\n<b>Percentage:</b> 9%",
"<b>DK/NA</b>\n<b>Question:</b> Question_Text_2\n<b>n=</b> 8\n<b>Percentage:</b> 24%",
"<b>DK/NA</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 6\n<b>Percentage:</b> 13%",
"<b>DK/NA</b>\n<b>Question:</b> Question_Text_3\n<b>n=</b> 8\n<b>Percentage:</b> 24%"
), Ord = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4,
4, 4, 4), Question_Text = structure(c(3L, 1L, 1L, 2L, 2L, 3L,
1L, 1L, 2L, 2L, 3L, 1L, 1L, 2L, 2L, 3L, 1L, 1L, 2L, 2L), .Label = c("Question_Text_2",
"Question_Text_3", "Question_Text_1"), class = "factor")), row.names = c(NA,
-20L), .Names = c("Resp", "Rating", "Question", "count", "prop",
"Label", "tooltip", "Ord", "Question_Text"), class = c("tbl_df",
"tbl", "data.frame"))
A couple of additional bits: 几个附加的位:
#Value colours
Labels_Colours <- c("Satisfied" = "#59A14F", "Neutral" = "#76B7B2", "Dissatisfied" = "#F28E2B", "DK/NA" = "#BAB0AC")
#Tooltip feature
tooltip_css <- "background-color:white;font-style:italic;padding:10px;border-radius:10px 20px 10px 20px;"
Here's what the chart in ggplot2
looks like. ggplot2
的图表如下所示。 This chart is exactly what I want my ggiraph
chart to look like: 该图表正是我希望我的ggiraph
图表显示的样子:
library(ggplot2)
library(dplyr)
mydf %>% filter(prop > 0 | is.na(prop)) %>%
ggplot(aes(x = Label, y = ifelse(is.na(prop), 0, prop), fill = Rating)) +
geom_col() +
geom_text(aes(label = ifelse(is.na(prop), prop, percent(round(prop, 2)))), position = position_stack(vjust = 0.5), size = 3) +
scale_fill_manual(values = Labels_Colours) +
coord_flip() +
facet_grid(~ Resp, drop = FALSE) +
labs(x = "", y = "") +
theme_minimal() +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)
Now, here's my attempt at the final product, using ggiraph
. 现在,这是我使用ggiraph
进行最终产品的尝试。 The only difference in the code here is that I'm using geom_bar_interactive
instead of geom_col
, and of course the last line: 此处代码的唯一区别是,我使用的是geom_bar_interactive
而不是geom_col
,当然,最后一行是:
library(ggiraph)
mychart <- mydf %>% filter(prop > 0 | is.na(prop)) %>%
ggplot(aes(x = Label, y = ifelse(is.na(prop), 0, prop), fill = Rating)) +
geom_bar_interactive(aes(tooltip = tooltip, data_id = Rating), stat = "identity") +
geom_text(aes(label = ifelse(is.na(prop), prop, percent(round(prop, 2)))), position = position_stack(vjust = 0.5), size = 3) +
scale_fill_manual(values = Labels_Colours) +
coord_flip() +
facet_grid(~ Resp, drop = FALSE) +
labs(x = "", y = "") +
theme_minimal() +
theme(
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank()
)
ggiraph(code = print(mychart), width = 1, point = 4, width_svg = 8, height_svg = 2, tooltip_extra_css = tooltip_css, hover_css = "opacity:0.5")
The "DK/NA" bar somehow switched places with the "Dissatisfied" bar, but my percentage labels and the legend remain in the correct places. “ DK / NA”栏以某种方式与“不满意”栏切换了位置,但是我的百分比标签和图例仍保留在正确的位置。 What's causing this? 是什么原因造成的? I assume this has something to do with the order of the levels in the Rating
factor, but they appear to be in the correct order. 我认为这与Rating
系数中等级的顺序有关,但是它们似乎顺序正确。 I'm mystified. 我很迷惑
It's about grouping. 这是关于分组。 Aesthetics tooltip
and data_id
in geom_bar_interactive
(or in geom_bar
, same effect) make grouping different from the grouping of geom_text
. 美学tooltip
和data_id
在geom_bar_interactive
(或在geom_bar
,效果相同)使从分组的分组不同geom_text
。
[ http://ggplot2.tidyverse.org/reference/aes_group_order.html] By default, the group is set to the interaction of all discrete variables in the plot. [ http://ggplot2.tidyverse.org/reference/aes_group_order.html]默认情况下,该组设置为绘图中所有离散变量的相互作用。 This often partitions the data correctly, but when it does not, or when no discrete variable is used in the plot, you will need to explicitly define the grouping structure, by mapping group to a variable that has a different value for each group. 这通常可以正确地对数据进行分区,但是当不对数据进行分区时,或者在图中未使用任何离散变量时,您需要通过将组映射到每个组具有不同值的变量来显式定义分组结构。
Defining group aesthetic solves the issue (in main aes or in geom_bar ): 定义组美学解决了这个问题(在主要aes或geom_bar中 ):
mychart <- mydf %>% filter(prop > 0 | is.na(prop)) %>%
ggplot(aes(x = Label, y = ifelse(is.na(prop), 0, prop), fill = Rating, group = Rating)) +
geom_bar_interactive(mapping = aes(tooltip = tooltip, data_id = Rating), stat = "identity") +
geom_text(aes(label = ifelse(is.na(prop), prop, percent(round(prop, 2)))), position = position_stack(vjust = 0.5), size = 3) +
scale_fill_manual(values = Labels_Colours) +
coord_flip() +
facet_grid(~ Resp, drop = FALSE) +
theme_minimal()
ggiraph(code = print(mychart), width = 1, point = 4, width_svg = 8, height_svg = 2, tooltip_extra_css = tooltip_css, hover_css = "opacity:0.5")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.