You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:26:06