如何基于两个总和为条形总长的变量制作双色堆叠条形图?
制作双色堆叠条形图的解决方案
1. 完善数据集
先给现有子数据集新增FemaleGrossing字段,计算逻辑为总平均票房减去男性票房:
library(dplyr) # 假设你的子数据集名为genre_data genre_data <- genre_data %>% mutate(FemaleGrossing = meanGrossing - MaleGrossing)
2. 转换数据格式
ggplot2绘制堆叠条形图需要长格式数据,用tidyr工具完成转换:
library(tidyr) long_format_data <- genre_data %>% select(Genre, MaleGrossing, FemaleGrossing) %>% pivot_longer( cols = -Genre, names_to = "GenderGroup", values_to = "GrossingValue" )
3. 绘制堆叠条形图
用ggplot2生成蓝粉双色堆叠图,X轴为电影类型,Y轴为平均总票房:
library(ggplot2) ggplot(long_format_data, aes(x = Genre, y = GrossingValue, fill = GenderGroup)) + geom_bar(stat = "identity") + # 指定蓝粉配色对应男女票房 scale_fill_manual(values = c("MaleGrossing" = "#1f77b4", "FemaleGrossing" = "#ff80ab")) + labs(title = "各类型电影男女票房占比", x = "电影类型", y = "平均总票房") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠
额外优化:简化初始数据集生成流程
你当前重复执行代码拼接的方式效率偏低,可以用批量处理逻辑生成完整子数据集:
# 假设raw_data中所有类型列都是二进制标识(如Animation=1代表该类型) all_genres <- c("Animation", "Family", "Action") # 替换为你的18个类型列名 # 批量生成各类型汇总数据 genre_data <- purrr::map_dfr(all_genres, function(genre_name) { raw_data %>% filter(.data[[genre_name]] == 1) %>% summarise( Genre = genre_name, meanGrossing = mean(InflatedGross), meanBudget = mean(InflatedBudget), MaleGrossing = mean(Proportion_male) * meanGrossing ) }) # 新增女性票房字段 genre_data <- genre_data %>% mutate(FemaleGrossing = meanGrossing - MaleGrossing)
内容的提问来源于stack exchange,提问作者Rose Campos
相关产品推荐
相关产品推荐

