如何在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é
相关产品推荐
相关产品推荐

