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

如何在ggplot2与R Markdown中缩短stat_function定义域并前置绘图点

解决短期竞争均衡图的两个绘图问题

针对你提到的两个绘图问题,下面是具体的解决方法和修改后的完整代码:

一、让灰色需求曲线在x=3.2处终止

原来的stat_function会基于整个绘图x范围绘制完整直线,要让demand_firm和demand_firm3在x=3.2(q*)处终止,直接用geom_segment绘制水平线段更直观,替代原来的stat_function:

  • 对于demand_firm:从x=0到x=3.2,y固定为7.6
  • 对于demand_firm3:从x=0到x=3.2,y固定为22

二、让黑点E、A、B显示在曲线前方

ggplot的图层遵循后绘制的图层覆盖先绘制的原则,原来的点标注在部分曲线之前,导致被遮挡。只需将所有黑点和对应文字的annotate代码移到所有曲线图层的最后,就能让点显示在最上层。


修改后的完整代码

library("tidyverse")
library("mosaic")
library("ggrepel")
library("fontawesome")
library("latex2exp")

# Define functions  
demand_firm <- function(x){7.6}
demand_firm2 <- function(x){15}
demand_firm3 <- function(x){22}
mc_cc <- function(x){3*x^2-8*x+10}
ac_cc <- function(x){0.5*x^2-2*x+18+18/x}
atc_cc <- function(x){x^2-4*x+10}

# Plotting 
ggplot(data.frame(x=c(0,11)), aes(x=x))+
  # 用geom_segment替代stat_function,绘制到x=3.2的灰色需求曲线
  geom_segment(x=0, xend=3.2, y=demand_firm(0), yend=demand_firm(0), size=2, color="gray")+
  stat_function(fun=demand_firm2, geom="line", size=2, color = "black")+
  geom_label(aes(x=4.6,y=demand_firm2(4)), color = "black", label="IMe=IMg=P", size = 5)+
  # 用geom_segment替代stat_function,绘制到x=3.2的灰色需求曲线
  geom_segment(x=0, xend=3.2, y=demand_firm3(0), yend=demand_firm3(0), size=2, color="gray")+
  stat_function(fun=mc_cc, geom="line", size=2, color = "red")+
  geom_label(aes(x=3.6,y=mc_cc(3.5)), color = "red", label="CMg(q)", size = 5)+
  stat_function(fun=ac_cc, geom="line", size=2, color = "orange")+
  geom_label(aes(x=4.6,y=ac_cc(5)), color = "orange", label = "CTMe(q)", size = 5)+
  stat_function(fun=atc_cc, geom="line", size=2, color = "brown")+
  geom_label(aes(x=4.6,y=atc_cc(4.5)), color = "brown", label = "CVMe(q)", size = 5)+
  geom_segment(x=3.2, xend=3.2, y=0, yend=22, size=1, linetype="dotted")+
  # 将所有点和文字标注移到最后,确保显示在最上层
  annotate("point", x = 3.2, y = 7.4, color = "black", size = 4) +
  annotate("text", x = 3.3, y = 6.5, label = "E", colour = "black", size = 5)+
  annotate("point", x = 3.2, y = 15, color = "black", size = 4) +
  annotate("text", x = 3.3, y = 14.4, label = "A", colour = "black", size = 5)+
  annotate("point", x = 3.2, y = 22, color = "black", size = 4) +
  annotate("text", x = 3.2, y = 23, label = "B", colour = "black", size = 5)+
  annotate("point", x = 2, y = 6, color = "blue", size = 4) +
  annotate("text", x = 2, y = 4.5, label = "Punto de\n cierre", colour = "blue", size = 5)+
  scale_x_continuous(breaks=c(0, 3.2),
                     labels=c(0, expression(q["*"])),
                     limits=c(0,5),
                     expand=c(0,0))+
  scale_y_continuous(breaks=c(0,demand_firm(2.125), demand_firm2(3.125), 
                              demand_firm3(4.125)),
                     labels=c(0,expression("F"), expression("D"), expression("C")),
                     limits=c(0,30),
                     expand=c(0,0))+
  guides(fill=F)+
  labs(
    x = "Producción",
    y = "Precio")+
  theme_classic(base_family = "Fira Sans Condensed", base_size=20)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 07:06:03