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

如何使用melt和ggplot绘制含堆叠列的双列柱状图?

解决你的R数据框柱状图绘制问题

嘿,我看你已经把数据处理的部分搞定了,就差画柱状图这一步啦!我来给你详细说说怎么实现,分两种常见的场景来演示,用R里最常用的ggplot2包来完成绘图。

首先先把你现有的数据处理代码整理好,确保能正常运行:

# 加载读取Excel的包
library(readxl)

# 读取并清洗数据
Raw_Portfolio_Data <- read_excel("RData2.xlsx", range = "Exposures! A10:E47", col_names = FALSE)
Raw_Portfolio_Data <- na.omit(Raw_Portfolio_Data)
Raw_Portfolio_Data <- round(Raw_Portfolio_Data, 2)
names(Raw_Portfolio_Data) <- c("Ticker", "Factor_Risk", "Stock_Specific_Risk", "Total_Risk", "Weight")

场景1:绘制分组柱状图(展示每个股票的多种风险值)

如果想把每个股票的Factor_Risk、Stock_Specific_Risk、Total_Risk放在同一张图里对比,需要先把宽格式的数据转成长格式,再绘图:

# 加载绘图和数据转换的工具包
library(ggplot2)
library(tidyr)

# 将宽格式数据转换为长格式,方便分组绘图
long_risk_data <- Raw_Portfolio_Data %>%
  pivot_longer(
    cols = c(Factor_Risk, Stock_Specific_Risk, Total_Risk), # 选择要转换的风险列
    names_to = "Risk_Type", # 新列:风险类型
    values_to = "Risk_Value" # 新列:风险数值
  )

# 绘制分组柱状图
ggplot(long_risk_data, aes(x = Ticker, y = Risk_Value, fill = Risk_Type)) +
  geom_bar(stat = "identity", position = position_dodge()) + # 分组并列显示柱子
  labs(
    title = "Portfolio Risk Breakdown by Stock Ticker",
    x = "Stock Ticker",
    y = "Risk Value",
    fill = "Risk Category"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签,避免重叠

如果想在柱子上显示具体的数值,可以加上geom_text让信息更直观:

ggplot(long_risk_data, aes(x = Ticker, y = Risk_Value, fill = Risk_Type)) +
  geom_bar(stat = "identity", position = position_dodge()) +
  geom_text(
    aes(label = Risk_Value),
    position = position_dodge(width = 0.9), # 和柱子的分组宽度匹配
    vjust = -0.2 # 把数值标签放在柱子上方
  ) +
  labs(
    title = "Portfolio Risk Breakdown by Stock Ticker",
    x = "Stock Ticker",
    y = "Risk Value",
    fill = "Risk Category"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

场景2:绘制单个变量的柱状图(比如只展示Total_Risk)

如果只需要展示某一个变量的柱状图,代码会更简洁,以Total_Risk为例:

ggplot(Raw_Portfolio_Data, aes(x = Ticker, y = Total_Risk)) +
  geom_bar(stat = "identity", fill = "#2c3e50") + # 自定义柱子颜色
  labs(
    title = "Total Risk of Each Stock in Portfolio",
    x = "Stock Ticker",
    y = "Total Risk"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

你也可以根据Weight列来调整柱子的颜色,让图更直观地体现持仓权重和风险的关系:

ggplot(Raw_Portfolio_Data, aes(x = Ticker, y = Total_Risk, fill = Weight)) +
  geom_bar(stat = "identity") +
  scale_fill_gradient(low = "#e3f2fd", high = "#1976d2") + # 设置颜色渐变
  labs(
    title = "Total Risk by Stock (Colored by Portfolio Weight)",
    x = "Stock Ticker",
    y = "Total Risk",
    fill = "Portfolio Weight"
  ) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

内容的提问来源于stack exchange,提问作者bigjdawg43

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:51:22