匹配 ggplot2 中的图例项和颜色,其中某些 geom_segment 未包含在图例中

2024-03-12

我似乎无法让我的图例标签和颜色在 ggplot2 中正确匹配。我有一些 geom_segments 我不想包含在图例中。我尝试了各种选择,但没有一个有效。现有的问题似乎都没有涉及未在绘图上标记某些元素的问题,所以这可能会增加复杂性。代码如下:

library("distr")
library("ggplot2")
Percent_values<-c(0.5,0.75,0.9,0.95,0.995,0.999)
Dist1_mean=20219
Dist1_CV=3235/20219
Dist1_SDEV<-Dist1_mean*Dist1_CV
Dist1_parm2<-sqrt(log(1+Dist1_CV^2))
Dist1_parm1<-log(Dist1_mean)-(Dist1_parm2^2)/2
Dist1_quant<-qlnorm(Percent_values,meanlog=Dist1_parm1,sdlog=Dist1_parm2)
#Now draw CDF with vertical line at mean, median and chosen percentile
a1<-stat_function(fun = 
plnorm,args=list(meanlog=Dist1_parm1,sdlog=Dist1_parm2),geom="line", 
colour="blue",size=1.25)
lowerx<-0
upperx<-1.1*Dist1_quant[6]
plot1<-ggplot(data.frame(x = c(lowerx, upperx)), aes(x = x))+a1
plot1<-
plot1+scale_x_continuous(name="Value")+scale_y_continuous(name="Cumulative 
probability")
#add mean vertical line and associated horizontal line to axis
mean_yvalue<-plnorm(Dist1_mean,meanlog=Dist1_parm1,sdlog=Dist1_parm2)
plot1<-plot1+geom_segment(aes(x=Dist1_mean,y=0,
xend=Dist1_mean,yend=mean_yvalue,colour="red"),size=1.25)
plot1<-
plot1+geom_segment(aes(x=0,y=mean_yvalue,xend=Dist1_mean,
yend=mean_yvalue,colour="red"),size=1.25,linetype="dotted",show.legend = 
FALSE)
#and 75th percentile
perc<-0.75
p75<-Dist1_quant[2]
plot1<-
plot1+geom_segment(aes(x=p75,y=0,xend=p75,
yend=perc,colour="green"),size=1.25)
plot1<-plot1+geom_segment(aes(x=0,y=perc,xend=p75,
yend=perc,colour="green"),size=1.25,linetype="dotted",show.legend = FALSE)
#and 99.5th
perc2<-0.995
p995<-Dist1_quant[6]
plot1<-
plot1+geom_segment(aes(x=p995,y=0,xend=p995,
yend=perc2,colour="orange"),size=1.25)
plot1<-
plot1+geom_segment(aes(x=0,y=perc2,xend=p995,
yend=perc2,colour="orange"),size=1.25,linetype="dotted",show.legend = FALSE)
plot1<-plot1+ggtitle("Cumulative density function of estimated future claims 
outgo")+
scale_colour_discrete(name="", labels=c("Lognormal", "Mean","75th 
%ile","99.5th %ile"))
plot1

这会生成一个图表(由于某种原因我似乎无法加载),其中a)只有三个图例项(“对数正态”,“平均值”和“75th %ile”),而我想要四个(另外“99.5% ile”) ile”添加到这三个),这三个项目分别为红色、绿色和蓝色,而我希望对数正态为蓝色,平均值为红色,第 75 个为绿色,第 99.5 个为橙色。虚线应保留在图上,但不会出现在图例中。

我究竟做错了什么?大概这与美学和“scale_colour_discrete”有关,但我不知道该怎么做。任何帮助将非常感激。

Thanks.


要添加到由 www 回答 https://stackoverflow.com/a/46625724/7662668,我发现如果您不为颜色名称创建美观的映射,则可以节省很多混淆的风险。相反,使用有意义的标签,例如"mean"为平均线。这样,如果您以后改变了对颜色选择的想法,您就不会得到诸如映射的手动比例之类的荒谬的东西"blue" to "orange".

一般来说,美学映射不应该直接映射到颜色,而是应该分配values稍后将映射到颜色(手动或自动)。

EDIT:

根据 bdemarest 的建议,我添加了一些更多的解释和代码。这是 www 对 OP 代码的重构:

library("distr")
library("ggplot2")

#calculations
Percent_values <- c(0.5,0.75,0.9,0.95,0.995,0.999)
Dist1_mean = 20219
Dist1_CV = 3235 / 20219
Dist1_SDEV <- Dist1_mean*Dist1_CV
Dist1_parm2 <- sqrt(log(1+Dist1_CV^2))
Dist1_parm1 <- log(Dist1_mean)-(Dist1_parm2^2)/2
Dist1_quant <- qlnorm(Percent_values, meanlog=Dist1_parm1,
                      sdlog=Dist1_parm2)
lowerx <- 0
upperx <- 1.1*Dist1_quant[6]
mean_yvalue <- plnorm(Dist1_mean, meanlog=Dist1_parm1, 
                      sdlog=Dist1_parm2)
perc <- 0.75
p75 <- Dist1_quant[2]
perc2 <- 0.995
p995 <- Dist1_quant[6]

#plot
ggplot(data.frame(x = c(lowerx, upperx)), aes(x = x))+
  stat_function(fun=plnorm,
                args=list(meanlog=Dist1_parm1,
                          sdlog=Dist1_parm2),
                geom="line",
                aes(colour="logn"), # logn label
                size=1.25) +
  scale_x_continuous(name="Value")+
  scale_y_continuous(name="Cumulative probability") +
  geom_segment(aes(x=Dist1_mean, y=0,
                   xend=Dist1_mean,
                   yend=mean_yvalue,
                   colour="mean"), # mean label
               size=1.25) +
  geom_segment(aes(x=0, y=mean_yvalue,
                   xend=Dist1_mean,
                   yend=mean_yvalue,
                   colour="mean"), # mean label
               size=1.25, linetype="dotted",
               show.legend = FALSE) +
  geom_segment(aes(x=p75, y=0,
                   xend=p75, yend=perc,
                   colour="75th"), # 75th percentile label
               size=1.25) +
  geom_segment(aes(x=0, y=perc, xend=p75,
                   yend=perc,
                   colour="75th"), # 75th percentile label
               size=1.25, linetype="dotted",
               show.legend = FALSE) +
  geom_segment(aes(x=p995, y=0, xend=p995,
                   yend=perc2,
                   colour="995th"), # 99.5th percentile label
               size=1.25) +
  geom_segment(aes(x=0, y=perc2, xend=p995,
                   yend=perc2,
                   colour="995th"), # 99.5th percentile label
               size=1.25, linetype="dotted",
               show.legend = FALSE) +
  ggtitle("Cumulative density function of estimated future claims outgo") +
  scale_colour_manual(name="",
                      # labels map onto colors and pretty labels
                      values=c("logn"="blue",
                               "mean"="red",
                               "75th"="green",
                               "995th"="orange"),
                      labels=c("logn"="Lognormal",
                               "mean"="Mean",
                               "75th"="75th %ile",
                               "995th"="99.5th %ile"))

请注意,在aes映射、颜色名称已替换为描述性标签(例如,"red" became "mean" and "blue" became "logn"),以及scale_colour_manual调用已更改为将这些标签映射到图例的颜色和漂亮标签上。这样,如果您稍后决定将第 75 个百分位段设为紫色而不是绿色,则只需更改颜色映射scale_colour_manual在底部调用——您不必深入研究代码并找到正确的geom_segments去改变,而且,如果你懒得这样做,你最终不会遇到可怕的事情,比如:

scale_colour_manual(values=c("blue"="blue",
                             "red"="red",
                             "green"="purple", # !!!???
                             "orange"="orange"))

相反,您(非常直观地)更改了颜色75th变为紫色的组件:

scale_colour_manual(values=c("logn"="blue",
                             "mean"="red",
                             "75th"="purple", # makes sense
                             "995th"="orange"))

更改代码以在美学映射中使用有意义的标签只会使其更清晰、更直观、更易于阅读和维护。它不会改变图表的最终输出:

但是,如果您打算尝试绘制包含大量组件和信息丰富的图例的复杂图表,那么这只是习惯上的一个小改变,可能会在以后为您节省大量的挫败感。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

匹配 ggplot2 中的图例项和颜色,其中某些 geom_segment 未包含在图例中 的相关文章

  • R 中的聚类分析:确定最佳聚类数

    如何选择最佳的聚类数量来进行 k 均值分析 绘制以下数据的子集后 多少个簇比较合适 如何进行聚类树突分析 n 1000 kk 10 x1 runif kk y1 runif kk z1 runif kk x4 sample x1 lengt
  • 如何导入 .tsv 文件

    我需要读取一个表 tsvR 中的文件 test lt read table file drug info tsv Error in scan file what nmax sep dec quote skip nlines na strin
  • r testthat 和 covr 在非包库中使用

    我希望能够使用testthat and covr在一个项目中not一个 r 包 事实上不使用任何第三方服务 只是普通的旧 r 源文件的集合 我正在努力找出这是否可行 如果可以 则已设置有关如何设置的说明 我发现假设你正在编写一个 r 包 我
  • 使用 ggplot 未完全填充等值线图

    我正在尝试使用以下方法绘制我的第一个填充等高线图ggplot 根据我的数据 我期待类似的结果 但我的结果是 a lt c 1 1 1 1 1 3 1 2 2 2 2 2 2 5 2 1 3 3 3 3 1 3 2 b lt c rep c
  • R CMD 检查警告:在文档对象中使用的函数/方法...但不在代码中

    我正在写一个包 但一个持久的R CMD check警告阻止我完成包裹并将其发布到 CRAN 我用roxygen2对于内联文档 尽管这可能不是错误的根本原因 如果您知道如何删除此警告 我很可能可以找到一种方法来使用roxygen2 如何删除警
  • Mac OS X 10.13 上的 RStudio 在尝试使用 fix() 时出现 X11 不可用错误

    我已经使用自制程序在我的计算机上安装了 XQuartz 然后重新启动了我的计算机 当我尝试在 RStudio 中使用 fix 命令时 出现以下错误 gt College read csv College csv header T na st
  • 从频率表生成 data.frame

    我在 2 4 数组中有包含 500 个观察值的合成数据 datax array c 120 181 50 43 41 33 24 8 dim c 2 4 dimnames datax list gender c male female pu
  • R 抑制系统或 shell 命令的控制台输出

    我有这个 Windows 批处理文件 我使用 R 从 R 调用该文件shell 命令 该批处理文件执行一些计算并将它们写入磁盘上 也写入屏幕上 我只对磁盘输出感兴趣 我无法更改批处理文件 批处理文件可能有点愚蠢 例如 echo off ec
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • R:install.packages 中出现错误:无法打开连接

    我试图安装 RINDSEL 包 但无法安装它 并且不断收到以下错误 install packages 中出错 无法打开连接 我从以下位置下载了该软件包 rindsel 1 0 2 zip 综合养殖平台 http old ibpdev net
  • 如何在 rmarkdown 中显示带有 results='asis' 的格式化 R 输出

    当使用 results asis 时 有没有办法在 rmarkdown knitr 中显示格式化程序 R 输出 一个例子是以下函数 myfun lt function cat hello n cat c one 1 two 2 然后 该块将
  • 如何拆分 data.frame -> 将合并应用于子集 -> 合并到 data.frame 中

    我真的不知道如何在不使用 for 循环的情况下实现这一目标 x lt c a b c d gt x 1 a b c d data lt data frame x c a b a b c a a b c d name c one one tw
  • 如何在 R 树形图中省略标签?

    我一直在使用R 树形图包 http cran r project org web packages treemap treemap pdf我有一个 2 层深的树形图 我希望打印第二级标签 但不打印第一级标签 使用手册页中的示例 tmPlot
  • 用于带有嵌套子图的图的 r 包? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个用于图形 网络的 r 包 它可以处理嵌套子图 Graphviz 做到了这一点 但只提供可
  • R data.table fread 使用不带标题的命名 colClasses(例如没有 col.names?)

    更新 2016 年 6 月 col names 已添加到 data table 1 9 6 所以问题已经结束 每个人都非常高兴 我想我现在可以将所有 read csv 调用转换为 fread 调用 而不必担心破坏 原问题 使用数据表1 9
  • ggplot2 中的小时刻度

    我正在处理就寝时间和醒来时间 因此我想创建一个具有 24 小时 x 轴的图表 从第一天中午 12 点开始 到第二天中午 12 点结束 这意味着晚上 11 59 之后 它应该再次从 0 开始 同样的问题 仅涉及数字 我想创建一个从 10 到
  • 自定义 colorRampPalette 中的颜色条

    我定义了一个 colorRampPalette my colors colorRampPalette c light green yellow orange red 如何为其绘制颜色条 图例 项目 最好仅使用基本包 我正在寻找一个充满该颜色
  • 使用 X11 窗口的 R 脚本仅打开一秒钟

    我正在通过 Linux Mint 16 命令行运行 R 脚本 它包含我想在窗口中显示的箱线图 所以我使用 x11 函数来创建该窗口 这是我的代码 testdata lt data frame sample 1 1000 size 100 r
  • S4 类 [(子集)带有附加参数的继承

    这是一个扩展在 R 中的访问器函数中使用 callNextMethod https stackoverflow com q 24875284 2752888 2017 03 25 更新 为了说明如何仅在加载方法时失败 但在构建的包中时不会失
  • 为什么我必须在每次 R 升级时手动创建目录“~/R/%p-library/%v”?

    每次R升级后 我必须重新安装我使用的软件包 来自源代码 因此必须为新版本重新编译它们 这是一个正确的 可以理解的行为 所以我调用install packages http stat ethz ch R manual R devel libr

随机推荐

  • Javascript - 所有嵌套的 forEach 循环完成后的回调

    我确信这是一个相当简单的任务 但我现在无法全神贯注 我有一组嵌套的 forEach 循环 当所有循环运行完毕时 我需要一个回调 我愿意使用 async js 这就是我正在处理的 const scanFiles function accoun
  • 如何使用 BiWeekly 库和 Java Mail API 创建现有事件并发送更新?

    我在用着BiWeekly http sourceforge net projects biweekly 库来创建 VEVENT 然后使用以下命令发送它Java 邮件 API https java net projects javamail
  • 具有动态数量的并行消费者的 Kafka 工作队列

    我想用Kafka来 分工 我想将工作实例发布到某个主题 并运行由相同使用者组成的云来处理它们 当每个消费者完成其工作时 它将从该主题中提取下一个工作 每项工作只能由一个消费者处理一次 处理工作非常昂贵 因此我需要在许多机器上运行许多消费者才
  • New (std::nothrow) 与 try/catch 块中的 New

    学习后我做了一些研究new 不像malloc 我习惯了 分配失败时不会返回 NULL 并且发现有两种不同的方法来检查 new 是否成功 这两种方式是 try ptr new int 1024 catch std bad alloc exc
  • PayPal 自适应付款错误 您无权隐式执行此付款

    我有一个发送付款的简单应用程序 该应用程序在沙箱中运行良好 实时经典应用程序的应用程序 ID 已获得批准 显示为 自动批准 但当我输入实时凭据时 它返回错误 您无权隐式执行此付款 发送 XML 到端点https svcs paypal co
  • 在钩子 woocommerce_checkout_order_processed 中获取订单详细信息

    add action woocommerce checkout order processed send order fax function send order fax order id print r REQUEST die 我想在这
  • JavaScript 异步返回值/使用 jQuery 赋值[重复]

    这个问题在这里已经有答案了 我有以下 jQuery 函数 我正在尝试返回此处显示的 GUID 值alert 警报工作正常并且值已填充 但是我似乎无法将其分配给变量并返回其值 最终我需要访问其他函数中的GUID值等 我尝试过的所有内容都仅显示
  • 不可变对象是线程安全的,但为什么呢?

    举例来说 一个线程正在通过创建不可变类的对象来创建和填充不可变类的引用变量 而另一个线程在第一个线程完成并创建不可变类的另一个对象之前启动 那么不可变类的用法不是线程吗不安全 创建不可变对象还意味着所有字段都必须标记为final 如果引用了
  • Linq to SQL - 关闭代码中的 UpdateCheck

    我想关闭UpdateCheck所有成员的功能 除了他们的主键 现在我按照下面的示例作为指导 但是我的表的 MetaDataMembers 仍然设置为Always http www the lazy coder com 2013 04 set
  • System.ArgumentException'jobobject' 不得为 IntPtr.Zero。参数名称:jobobject

    我收到一个错误 我无法理解 我在 void 方法中有这个简单的警报对话框生成器 private void startAction AlertDialog Builder builder builder new AlertDialog Bui
  • 如何使用 PowerShell 检查是否启用了 Hyper-V?

    我正在尝试编写一个 PowerShell 脚本来检查 Windows 可选功能以查看是否安装了 Hyper V 但是 我的代码不起作用 即使 Hyper V 已禁用 脚本也会输出它已启用的信息 Requires RunAsAdministr
  • 将 MySQL 服务器连接到 NetBeans

    我正在尝试在 Netbeans 中连接 MySQL 数据库 但停留在第一步 连接数据库 我的数据库在控制台上工作正常 尝试命令 mysqladmin u root p ping 它说 mysql id 还活着 我什至从控制台创建了数据库 现
  • 从 3D 平面到平行于图像平面的平面的单应性

    我有一张图像 其中场景中有一个校准目标 已知几何形状 假设桌子上有一个简单的 2 x 2 正方形 我想执行透视变换 使用warpPerspective 以便生成的图像是桌子的正交视图 就好像相机轴与桌子法线平行 计算单应性的标准过程是从一个
  • 从字符串中删除每个第 n 个元素

    如何删除字符串中的每第 n 个元素 我猜你会使用drop以某种方式发挥作用 就像这样删除第一个 n 你怎么能改变它 只删除第 n 个 然后是后面的第 n 个 依此类推 而不是全部 dropthem n xs drop n xs 简单的 取
  • 脚本在 上时不起作用

    我证明了剧本 它的作品 但在 我不擅长剧本 也许这是一个简单的问题 基本上 脚本只是显示 当鼠标悬停在图像上时 img1 mouseover functi
  • 字节顺序、“最高有效”和“最低有效”

    我在网上阅读了描述大端和小端的描述 然而 它们似乎基本上都以相同的方式读取 我仍然对 最多 和 最少 有效字节的实际实现感到困惑 据我了解 小端值首先评估 最低有效 值 而在大端值下 首先评估 最高有效 字节 但是 我不清楚 最 和 最不
  • 为什么类不能用作模块?

    Module是的超类Class Class superclass gt Module 在面向对象编程中 这意味着Class可以在任何有实例的地方使用Module可以使用 令人惊讶的是 情况并非如此ClassRuby 中的实例 class C
  • 使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval

    我正在寻找一个很好的解决方案来通过字符串值访问属性 但如果该属性不存在 则应该创建它 如果根结构已经定义了该结构的某些部分 则不应覆盖这些属性 而应合并这些属性 例如 如果您有一个空对象test并且您想在不使用 eval 的情况下设置深层结
  • 如何用
    $...$
    替换 LaTeX $...$ 和 $$...$$ 符号?

    我目前遇到的问题是 Jekyll 不能很好地与 Markdown 和 LaTeX 配合使用 所以我有很多文章 frac some latex or int e v en more 我该如何更换 by span span and by div
  • 匹配 ggplot2 中的图例项和颜色,其中某些 geom_segment 未包含在图例中

    我似乎无法让我的图例标签和颜色在 ggplot2 中正确匹配 我有一些 geom segments 我不想包含在图例中 我尝试了各种选择 但没有一个有效 现有的问题似乎都没有涉及未在绘图上标记某些元素的问题 所以这可能会增加复杂性 代码如下