R语言:绘制与部门营收变动幅度成正比的颜色编码圆圈图表
嘿,我来帮你搞定这个R语言的可视化需求!咱们一步步来,先处理数据,再实现你要的两种圆圈图表~
第一步:数据准备
首先咱们先把原始的宽格式数据转换成ggplot2友好的长格式,这是ggplot2绘图的最佳实践:
# 创建原始数据框 df <- data.frame( "Dept 1" = 0.5, "Dept 2" = 0.1, "Dept 3" = -0.3, "Dept 4" = 0.4, "Dept 5" = -0.1 ) # 加载tidyr包转成长格式 library(tidyr) df_long <- pivot_longer(df, cols = everything(), names_to = "Department", values_to = "Change")
需求1:大小对应绝对值,颜色区分正负
接下来实现你要的第一个图表:每个部门一个圆圈,大小和营收变动绝对值成正比,正的绿、负的红:
library(ggplot2) ggplot(df_long, aes(x = Department, y = 1, # 把y设为1让所有圆圈在同一水平线上 size = abs(Change), # 圆圈大小绑定变动绝对值 color = ifelse(Change > 0, "green", "red"))) + geom_point(alpha = 0.7) + # 加一点透明度让图表更柔和 scale_size_continuous(range = c(5, 15)) + # 自定义圆圈大小的范围,避免太突兀 scale_color_identity(guide = "legend", labels = c("Negative", "Positive")) + # 手动设置图例标签 labs(title = "Department Revenue Changes", size = "Absolute Change", color = "Change Direction", y = "") + # 去掉无用的y轴标签 theme_minimal() + theme(axis.text.y = element_blank(), # 隐藏y轴刻度和线条 axis.ticks.y = element_blank())
代码说明:
y = 1是为了让所有部门的圆圈都排列在同一行,如果你想让每个圆圈单独占一行,也可以把y设为Department,变成垂直排列。scale_size_continuous用来调整圆圈的最小和最大尺寸,你可以根据需求修改range里的数值。scale_color_identity是因为我们直接用了颜色字符串("green"/"red"),需要手动指定图例才能正常显示。
需求2:颜色编码与幅度成正比(深浅对应变动大小)
你问到的“将变量绘制为与幅度成正比的颜色编码圆圈”,其实就是让颜色的深浅对应营收变动的绝对值——正数越大越绿,负数绝对值越大越红。我们可以用渐变色彩来实现:
ggplot(df_long, aes(x = Department, y = 1, size = abs(Change), # 大小依然绑定绝对值 color = Change)) + # 颜色直接绑定变动值,用渐变映射 geom_point(alpha = 0.7) + scale_size_continuous(range = c(5, 15)) + scale_color_gradient2(low = "darkred", mid = "white", high = "darkgreen", midpoint = 0, name = "Revenue Change") + # 0为中间点,正负分别用红绿渐变 labs(title = "Department Revenue Changes (Color-Coded by Magnitude)", size = "Absolute Change", y = "") + theme_minimal() + theme(axis.text.y = element_blank(), axis.ticks.y = element_blank())
代码说明:
scale_color_gradient2是关键,它支持三元渐变:low对应最小的负值(深红),mid对应0(白色),high对应最大的正值(深绿)。这样颜色的深浅就会和变动幅度的大小直接挂钩。- 如果你想要不同的配色,比如用蓝色代表正、橙色代表负,只需要修改
low和high的颜色值就行。
内容的提问来源于stack exchange,提问作者Alex Kinman
相关产品推荐
相关产品推荐

