ggplot:使用最小值和最大值的分类值添加 geom_rect

duh*_*ime 2 r ggplot2

我有一个非常基本的 ggplot:

library(ggplot)

ggplot(mpg, aes(x=displ, y=manufacturer)) +
  geom_point() +
  geom_rect(aes(xmin=1.8, xmax=3.0, ymin='audi', ymax='audi', fill='red')) 
Run Code Online (Sandbox Code Playgroud)

我想为 y 轴上的 audi 行添加一个从 x 轴值 1.8 到 3.0 的条。有没有办法在 ggplot 中实现这一点?其他人可以在这个问题上提供的任何帮助将不胜感激!

Ian*_*ell 9

基于 @Greg 的答案,我相信在aes中的调用中重新创建因子级别更安全geom_rect。这是因为是因子级别而不是字符串被强制转换为整数。

ggplot(mpg, aes(x=displ, y=manufacturer)) +
  geom_point() +
  geom_rect(aes(ymin = which(levels(as.factor(manufacturer))=="audi") -0.5,
                ymax = which(levels(as.factor(manufacturer))=="audi") +0.5,
                xmin=1.8,
                xmax=3,
                fill="red"))

Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

即使因子水平已从默认值更改,这仍然有效:

my.mpg <- mpg
my.mpg$manufacturer <-as.factor(my.mpg$manufacturer)
my.mpg$manufacturer <-factor(my.mpg$manufacturer,
                             levels = rev(levels(my.mpg$manufacturer)))
ggplot(my.mpg, aes(x=displ, y=manufacturer)) +
  geom_point() +
  geom_rect(aes(ymin = which(levels(as.factor(manufacturer))=="audi") -0.5,
                ymax = which(levels(as.factor(manufacturer))=="audi") +0.5,
                xmin=1.8,
                xmax=3,
                fill="red"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

相反,该which(unique(...))方法失败:

man_list <- unique(my.mpg$manufacturer)

ggplot(my.mpg, aes(x=displ, y=manufacturer)) +
  geom_point() +
  # geom_rect(aes(xmin=1.8, xmax=3.0, ymin= "audi", ymax=lead("audi"), fill='red')) 
  geom_rect(aes(ymin = which(man_list=="audi")-0.5,
                ymax = which(man_list=="audi")+0.5,
                xmin=1.8,
                xmax=3,
                fill="red"))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Gre*_*reg 6

可以办到。分类值被转换为整数以进行绘图,因此您可以将它们指定为整数(audi是第一个类别,所以整数是1),或者,正如我在下面所做的那样,列出类别名称并按名称指定。

library(ggplot)
data("mpg")
man_list <- unique(mpg$manufacturer)

ggplot(mpg, aes(x=displ, y=manufacturer)) +
  geom_point() +
  # geom_rect(aes(xmin=1.8, xmax=3.0, ymin= "audi", ymax=lead("audi"), fill='red')) 
  geom_rect(aes(ymin = which(man_list=="audi")-0.5,
                ymax = which(man_list=="audi")+0.5,
                xmin=1.8,
                xmax=3,
                fill="red"))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明