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

如何在ggplot2中设置非线性间距的X轴刻度?美国收益率曲线绘图优化需求

解决ggplot2中收益率曲线X轴非均匀刻度间距的问题

我完全懂你的需求——就是要让1年期以内的短端收益率刻度挤在一起,突出这段曲线的陡峭感,同时长端的刻度保持正常间距对吧?用默认的因子型X轴确实搞不定,因为离散刻度的间距是均匀分配的,这里我们可以把X轴转换成连续数值型,通过自定义数值映射来精准控制刻度间距。

具体实现步骤:

  1. 自定义期限-数值映射:给每个期限分配一个连续数值,让短端(1 Mo、3 Mo、6 Mo)的数值间隔尽量小,1 Y之后的数值间隔对应实际期限差(比如2 Y比1 Y大1,3 Y比2 Y大1),这样就能实现你要的“前密后疏”效果。
  2. 更新数据集:把映射好的数值加入到你的数据框中。
  3. 调整ggplot代码:用连续数值作为X轴,再通过scale_x_continuous把刻度标签替换回原来的期限名称。

完整可运行代码:

先处理你的原始数据(注意你原来的factor里写了7 Y但数据集里没有,我先去掉避免报错):

# 你的原始数据集
a <- data.frame(
  Interest = c('1 Mo', '3 Mo', '6 Mo','1 Y','2 Y','3 Y', '5 Y','10 Y', '20 Y', '30 Y'),
  February = c(2.186, 2.626, 3.128, 3.290, 3.214, 3.149, 2.923, 2.864, 2.774, 2.999),
  August = c(0.035, 0.279, 0.590, 0.900, 1.368, 1.631, 1.824, 1.924, 2.323, 2.253)
)

# 创建期限到连续数值的映射表,可根据视觉需求调整数值
x_mapping <- data.frame(
  Interest = c('1 Mo', '3 Mo', '6 Mo','1 Y','2 Y','3 Y', '5 Y','10 Y', '20 Y', '30 Y'),
  x_value = c(1, 2, 3, 5, 6, 7, 9, 14, 24, 34) # 短端间隔1,1Y与6Mo间隔2,长端按年份差设间隔
)

# 把映射数值合并到原数据
a <- merge(a, x_mapping, by = "Interest")

# 绘制调整后的收益率曲线
library(ggplot2)
ggplot(a, aes(x = x_value, y = August, group = 1)) +
  geom_line(color = "darkred") +
  geom_point(color = "darkred") +
  geom_point(aes(y = February), color = "darkblue") +
  geom_line(aes(y = February), color = "darkblue") +
  # 设置X轴刻度:用原始期限名称替换数值标签
  scale_x_continuous(
    breaks = x_mapping$x_value,
    labels = x_mapping$Interest
  ) +
  theme_bw() +
  labs(x = "Interest Term") # 给X轴添加清晰标签

效果说明:

  • 短端的1 Mo、3 Mo、6 Mo三个刻度间距非常紧凑,能直观展示这段曲线的陡峭斜率;
  • 1 Y之后的刻度间距对应实际期限差(比如1 Y到2 Y间隔1,5 Y到10 Y间隔5),保持长端的正常视觉比例;
  • 曲线连接逻辑完全正确,group=1保证了数据按原始期限顺序连接。

你可以根据自己的视觉偏好调整x_mapping里的数值,比如想让短端更挤,可以把1 Mo设为1,3 Mo设为1.5,6 Mo设为2,1 Y设为4,灵活度很高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 16:59:08