AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79600174
Accepted
José
José
Asked: 2025-04-30 18:55:50 +0800 CST2025-04-30 18:55:50 +0800 CST 2025-04-30 18:55:50 +0800 CST

如何在 ggplot2 中用另一种颜色填充曲线的增加部分?[重复]

  • 772
这个问题已经有答案了:
无法找到在 R 中的线图中为月份着色的解决方案 (2 个答案)
12 小时前关闭。

在绘制红色曲线的增加部分时,有没有办法使用另一种颜色,我的意思是,我想从青色点开始更改颜色,即增加的部分,只是为了说明它是供给曲线。

供给曲线

我提供复制的代码:

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

mc_cc<-function(x){3*x^2-8*x+10}
ac_cc<-function(x){x^2-4*x+10+10/x}
atc_cc<-function(x){x^2-4*x+10}

ggplot(data.frame(x=c(0,11)), aes(x=x))+
stat_function(fun=mc_cc, geom="line", size=2, color = "red")+
geom_label(aes(x=4.3,y=mc_cc(4.1)), color = "red", label="CMg(q)", size = 5)+
stat_function(fun=ac_cc, geom="line", size=2, color = "blue")+
geom_label(aes(x=4.6,y=ac_cc(5)), color = "blue", label = "CTMe(q)", size = 5)+
stat_function(fun=atc_cc, geom="line", size=2, color = "deepskyblue")+
geom_label(aes(x=4.6,y=atc_cc(4.5)), color = "deepskyblue", label = "CVMe(q)", size = 5)+
geom_segment(x=0, xend=2, y=6.1, yend=6.1, size=1, linetype="longdash", color = "cyan")+
geom_segment(x=3.3, xend=3.3, y=0, yend=16, size=1, linetype="dotted")+
geom_segment(x=0, xend=3.3, y=16, yend=16, size=1, linetype="dotted")+
geom_segment(x=4, xend=4, y=0, yend=26, size=1, linetype="dotted")+
geom_segment(x=0, xend=4, y=26, yend=26, size=1, linetype="dotted")+
annotate("point", x = 2, y = 6.1, color = "cyan", size = 4) +
annotate("text", x = 2, y = 3.5, label = "Punto de\n cierre de\n la empresa", colour = "deepskyblue", size = 4)+
annotate("text", x = 3.4, y = 20, label = "Curva de Oferta", colour = "darkgreen", size = 6, angle = 63)+
annotate("point", x = 3.3, y = 16, color = "black", size = 4) +
annotate("point", x = 4, y = 26, color = "black", size = 4) +
scale_x_continuous(#breaks=NULL,
                 limits=c(0,5.5),
                 expand=expand_scale(mult=c(0,0.1)))+
scale_y_continuous(#breaks=NULL,
                 limits=c(0,30),
                 expand=expand_scale(mult=c(0,0.1)))+
guides(fill=F)+
labs(#title = "Representative Firm",
   x = "Producción",
   y = "Precio")+
theme_classic(base_family = "Fira Sans Condensed", base_size=20) +
scale_x_continuous(breaks=c(0,2, 3.3, 4),
                 labels=c(0, expression(""), expression(q["1"]), expression(q["2"])),
                 limits=c(0,5),
                 expand=c(0,0))+
scale_y_continuous(breaks=c(0, 6.1, 16, 26),
                 labels=c(0,expression("P=CVMe"), expression(P["1"]), 
expression(P["2"])),
                 limits=c(0,30),
                 expand=c(0,0))
  • 2 2 个回答
  • 62 Views

2 个回答

  • Voted
  1. Tim G
    2025-04-30T20:02:39+08:002025-04-30T20:02:39+08:00

    一种选择是使用两个stat_functions并设置x_lim来限制曲线范围。我还将您的geom_label调用更改为annotate,并删除了重复调用的第一个实例scale_x/y_continuous。此外,您不必在 . 内使用引号library。Size也已弃用,linewidth应该使用 。

    编辑一下,这个帖子可以作为重复帖子直接关闭。不过我在 limey 找到重复帖子之前就已经发过了,所以还是把它保留在可见状态吧,万一有人明确想用stat_function两种颜色。

    出去

    library(ggplot2)
    
    mc_cc<-function(x){3*x^2-8*x+10}
    ac_cc<-function(x){x^2-4*x+10+10/x}
    atc_cc<-function(x){x^2-4*x+10}
    
    ggplot(data.frame(x=c(0,11)), aes(x=x))+
      stat_function(fun = mc_cc, xlim = c(0, 2), color = "red", linewidth = 2) +
      stat_function(fun = mc_cc, xlim = c(2, 5.5), color = "darkred", linewidth = 2) +
      annotate("label", x = 4.3, y = mc_cc(4.1), label = "CMg(q)", size = 5, color = "red")+
      stat_function(fun=ac_cc, geom="line", linewidth=2, color = "blue")+
      annotate("label", x=4.6,y=ac_cc(5), color = "blue", label = "CTMe(q)", size = 5)+
      stat_function(fun=atc_cc, geom="line", linewidth=2, color = "deepskyblue")+
      annotate("label", x=4.6,y=atc_cc(4.5), color = "deepskyblue", label = "CVMe(q)", size = 5)+
      geom_segment(x=0, xend=2, y=6.1, yend=6.1, linewidth=1, linetype="longdash", color = "cyan")+
      geom_segment(x=3.3, xend=3.3, y=0, yend=16, linewidth=1, linetype="dotted")+
      geom_segment(x=0, xend=3.3, y=16, yend=16, linewidth=1, linetype="dotted")+
      geom_segment(x=4, xend=4, y=0, yend=26, linewidth=1, linetype="dotted")+
      geom_segment(x=0, xend=4, y=26, yend=26, linewidth=1, linetype="dotted")+
      annotate("point", x = 2, y = 6.1, color = "cyan", size = 4) +
      annotate("text", x = 2, y = 3.5, label = "Punto de\n cierre de\n la empresa", colour = "deepskyblue", size = 4)+
      annotate("text", x = 3.4, y = 20, label = "Curva de Oferta", colour = "darkgreen", size = 6, angle = 63)+
      annotate("point", x = 3.3, y = 16, color = "black", size = 4) +
      annotate("point", x = 4, y = 26, color = "black", size = 4) +
      guides(fill="none")+
      labs(title = "Representative Firm",  x = "Producción", y = "Precio")+
      theme_classic(base_family = "Fira Sans Condensed", base_size=20) +
      scale_x_continuous(breaks=c(0,2, 3.3, 4),
                         labels=c(0, expression(""), expression(q["1"]), expression(q["2"])),
                         limits=c(0,5),
                         expand=c(0,0))+
      scale_y_continuous(breaks=c(0, 6.1, 16, 26),
                         labels=c(0,expression("P=CVMe"), expression(P["1"]), 
                                  expression(P["2"])),
                         limits=c(0,30),
                         expand=c(0,0))
    
    • 2
  2. Best Answer
    Claudio
    2025-04-30T21:07:36+08:002025-04-30T21:07:36+08:00

    您可以将x值与y计算出的一起atc_cc放入数据框中,并创建一个指示变量,该变量在 时切换x > 2。然后,您可以使用geom_line并将指示变量映射到color美学上,并使用scale_color_manual来更改颜色并隐藏图例:

    library("tidyverse")
    library("mosaic")
    library("ggrepel")
    library("fontawesome")
    
    mc_cc<-function(x){3*x^2-8*x+10}
    ac_cc<-function(x){x^2-4*x+10+10/x}
    atc_cc<-function(x){x^2-4*x+10}
    
    ## Create a dataframe with x values, y values for the curve and indicator variable
    
    df <- data.frame(x = seq(0, 11, len = 100)) |> 
      mutate(y = atc_cc(x),
             z = factor(ifelse(x < 2, 0, 1)))
    
    ggplot(data = df, aes(x = x)) + ## Use the dataset just created
    stat_function(fun=mc_cc, geom="line", size=2, color = "red")+
    geom_label(aes(x=4.3,y=mc_cc(4.1)), color = "red", label="CMg(q)", size = 5)+
    stat_function(fun=ac_cc, geom="line", size=2, color = "blue")+
    geom_label(aes(x=4.6,y=ac_cc(5)), color = "blue", label = "CTMe(q)", size = 5)+
    ## stat_function(fun=atc_cc, geom="line", size=2, color = "deepskyblue")+
    geom_line(aes(y = y, color = z), size = 2) + # instead of stat_function()
    scale_color_manual(values = c("green", "deepskyblue"), guide = "none") + # Change colors and suppress legend
    geom_label(aes(x=4.6,y=atc_cc(4.5)), color = "deepskyblue", label = "CVMe(q)", size = 5)+
    geom_segment(x=0, xend=2, y=6.1, yend=6.1, size=1, linetype="longdash", color = "cyan")+
    geom_segment(x=3.3, xend=3.3, y=0, yend=16, size=1, linetype="dotted")+
    geom_segment(x=0, xend=3.3, y=16, yend=16, size=1, linetype="dotted")+
    geom_segment(x=4, xend=4, y=0, yend=26, size=1, linetype="dotted")+
    geom_segment(x=0, xend=4, y=26, yend=26, size=1, linetype="dotted")+
    annotate("point", x = 2, y = 6.1, color = "cyan", size = 4) +
    annotate("text", x = 2, y = 3.5, label = "Punto de\n cierre de\n la empresa", colour = "deepskyblue", size = 4)+
    annotate("text", x = 3.4, y = 20, label = "Curva de Oferta", colour = "darkgreen", size = 6, angle = 63)+
    annotate("point", x = 3.3, y = 16, color = "black", size = 4) +
    annotate("point", x = 4, y = 26, color = "black", size = 4) +
    scale_x_continuous(#breaks=NULL,
                     limits=c(0,5.5),
                     expand=expand_scale(mult=c(0,0.1)))+
    scale_y_continuous(#breaks=NULL,
                     limits=c(0,30),
                     expand=expand_scale(mult=c(0,0.1)))+
    guides(fill=F)+
    labs(#title = "Representative Firm",
       x = "Producción",
       y = "Precio")+
    theme_classic(base_family = "Fira Sans Condensed", base_size=20) +
    scale_x_continuous(breaks=c(0,2, 3.3, 4),
                     labels=c(0, expression(""), expression(q["1"]), expression(q["2"])),
                     limits=c(0,5),
                     expand=c(0,0))+
    scale_y_continuous(breaks=c(0, 6.1, 16, 26),
                     labels=c(0,expression("P=CVMe"), expression(P["1"]), 
    expression(P["2"])),
                     limits=c(0,30),
                     expand=c(0,0))
    
    • 1

相关问题

  • 将复制活动的序列号添加到 Blob

  • Packer 动态源重复工件

  • 选择每组连续 1 的行

  • 图形 API 调用列表 subscribedSkus 状态权限不足,但已授予权限

  • 根据列值创建单独的 DF 的函数

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve