如果映射变量不是唯一的,则填充参数使用什么值(ggplot)

What value is used by the fill argument if the mapped variable isn't unique (ggplot)

假设我们有这样的数据:

df <- as.data.frame(matrix(ncol=4, nrow=12))
colnames(df) <- c("week", "hour", "fill", "day")

df$day <- rep(c("S", "S", "M", "M", "T", "T"), 2)
df$hour <- rep(seq(1,2,1),6)
df$week <- c(rep(seq(3,4,1),3), rep(seq(5,6,1), 3))
df$fill <- seq(1,120, 10)
print(df)
week hour fill day
3 1 1 S
4 2 11 S
3 1 21 M
4 2 31 M
3 1 41 T
4 2 51 T
5 1 61 S
6 2 71 S
5 1 81 M
6 2 91 M
5 1 101 T
6 2 111 T

然后我们用 ggplot2 绘制它。

ggplot(df, aes(x=hour, y =day, fill=fill))+
  geom_tile()+
  scale_x_continuous(breaks=seq(1,10,1))+
  scale_fill_viridis_c() 

ggplot 如何决定用什么填充每个“点”?在这种情况下,1 处的“点”,M 等于数据帧中的 21 和 81。

ggplot不需要决定绘制哪个填充值。它吸引了他们所有人。这些图块是不透明的,因此您只能看到在特定位置绘制的最后一个图块。通常,这只是数据点在数据框中的位置,稍后出现的点被绘制在最先出现的点之上。

我们可以通过简单地反转我们的数据框来看到这一点。在默认排序中,我们只看到最后 6 行:

ggplot(df, aes(x=hour, y =day, fill=fill))+
  geom_tile()+
  scale_x_continuous(breaks=seq(1,10,1))+
  scale_fill_viridis_c(limits = c(0, 120)) 

但如果我们反转行,我们会看到前 6 个:

ggplot(df[12:1, ], aes(x=hour, y =day, fill=fill))+
  geom_tile()+
  scale_x_continuous(breaks=seq(1,10,1))+
  scale_fill_viridis_c(limits = c(0, 120)) 

为了表明十二个图块都真的“在那里”,我们可以将绘图构建成 grob 树(就像 ggplot 在其打印方法中所做的那样):

p <- ggplot(df, aes(x=hour, y =day, fill=fill))+
  geom_tile()+
  scale_x_continuous(breaks=seq(1,10,1))+
  scale_fill_viridis_c(limits = c(0, 120)) 

g <- ggplot_gtable(ggplot_build(p))

如果我们找到用于显示磁贴的 rectgrob,我们将看到有十二个。例如,这里是所有 12 的图形参数:

 g$grobs[[6]]$children[[3]]$gp
#> $col
#>  [1] NA NA NA NA NA NA NA NA NA NA NA NA
#> 
#> $fill
#>  [1] "#440556" "#46256B" "#433D80" "#3E5489" "#36698C" "#2B7E8D" "#2B9289" "#23A684" "#50B773"
#> [10] "#6EC85E" "#99D64A" "#D0E03A"
#> 
#> $lwd
#>  [1] 0.2845276 0.2845276 0.2845276 0.2845276 0.2845276 0.2845276 0.2845276 0.2845276 0.2845276
#> [10] 0.2845276 0.2845276 0.2845276
#> 
#> $lty
#>  [1] 1 1 1 1 1 1 1 1 1 1 1 1
#> 
#> $linejoin
#> [1] "mitre"
#> 
#> $lineend
#> [1] "butt"

reprex package (v2.0.1)

于 2022-05-17 创建