堆叠、分组和多面图 y gg 图的问题

问题描述 投票:0回答:1

我正在尝试创建一个图表。这是数据的代码:

ea3 <- ddply(dias_semana, c("mes","weekday", "member_casual", "rideable_type"), summarise, n = sum(n))

ea3$rideable_type <- factor(ea3$rideable_type, levels = c("classic_bike", "electric_bike"))

ea3$fill_var <- factor(interaction(ea3$member_casual, ea3$rideable_type), 
                      levels = c("casual.classic_bike", "casual.electric_bike",
                                "member.classic_bike", "member.electric_bike"))

这是 ggplot 代码。

theme_set(theme_bw(base_size = 12))
plot_diassem_m_mc = ggplot(ea3, aes(x=factor(weekday, 
                                   level = c("lunes","martes","miércoles", 
                                             "jueves","viernes","sábado",
                                             "domingo")), y = n, fill=fill_var)) +
  geom_bar(stat = "identity", position=position_dodge(), width = 0.7)+
  theme(plot.title=element_text(size=11))+
  theme(axis.text.x=element_blank(), 
        axis.ticks.x=element_blank())+
  theme(axis.title=element_text(size=10))+
  theme(axis.text.y=element_text(size=8))+
  theme(legend.title=element_blank())+
  labs(title = "Gráfico 11. Número de viajes por cada día de la semana, según mes",
       x = "",
       y = "")+
  facet_wrap(~mes)+
  theme(strip.text = element_text(size = 7, color = "dark green"))+
  theme(legend.key.height= unit(0.2, 'cm'),
        legend.key.width= unit(0.3, 'cm'),
        legend.text = element_text(size=9))+
  scale_fill_discrete(labels=c('casuales (bici clásica)', 'casuales (bici eléctrica)', 
                               'miembros (bici clásica)', 'miembros (bici eléctrica)'))
print(plot_diassem_m_mc)

结果是这个图:

enter image description here

在此图中,我们有 12 个月。每个月中,一周中的每一天都有四个条形。最左边的四个条代表周一的值,最右边的四个条代表周日的值。其他的属于一周中的其他日子。所以,我想要两个而不是四个。一个栏用于休闲栏,另一个栏用于会员栏(member_casual 列)。然后,我想将每个栏分为两部分:一个用于经典自行车,一个用于电动自行车(每个部分应具有不同的颜色)。最后,我想要一个图表,其中一周的每一天都有两个条形,并且由于经典自行车和电动自行车的划分,每个条形应该有两种不同的颜色。

请您帮忙解决这个问题。预先感谢。

r ggplot2 bar-chart grouped-bar-chart
1个回答
0
投票

我只能想到通过大量的手动计算和geom_rect()来做到这一点。每天都会给出一个整数值,然后根据casual_member 的值向左或向右移动矩形,如果值为 elec,则向上移动矩形。显然,这只是一个草图。 我留下了 DF 的中间打印作为注释。使用这些可以帮助您了解数据框架是如何构建的。 因为你没有发布任何数据,所以我发明了一个小数据集。

library(tidyverse)
DF <- data.frame(Month = rep(c("Feb", "Mar"), each = 8),
                 Day = rep(c("Mon", "Tues"), 8),
                 casual_member =rep(rep(c("casual", "member"),each=4),2),
                 Elec = rep(c("classic", "classic", "elec", "elec"), 4),
                 Value = c(23,14,10,25,22,16,8,19,20,7,15,21,17,10,18,9))
#DF
DF <- DF |> mutate(JoinValue = ifelse(Elec == "classic", "elec", "classic"))
#DF
DF <- inner_join(DF, DF, by = c("Month", "casual_member", "Day", Elec = "JoinValue"))
#DF
DF <- DF |> mutate(ymin = ifelse(Elec == "classic", 0, Value.y),
             ymax = ifelse(Elec == "classic", Value.x, Value.x + Value.y),
             x_center = case_when(
               Day == "Mon" ~ 1,
               Day == "Tues" ~ 2
             ),
             x_shift = case_when(
               casual_member == "casual" ~ -0.2,
               TRUE ~ 0.2
             ),
             X = x_center + x_shift)

#DF
ggplot(DF, aes(xmin = X - 0.2, xmax = X + 0.2, ymin = ymin, ymax = ymax, 
               fill = interaction(Elec, casual_member))) + geom_rect() +
  facet_wrap(~Month) +
  scale_x_continuous(breaks = c(1,2), labels = c("Mon", "Tues")) +
  labs(fill = "Categories")

创建于 2024-10-09,使用 reprex v2.1.1

© www.soinside.com 2019 - 2024. All rights reserved.