如果映射变量不是唯一的,则填充参数使用什么值(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 创建
假设我们有这样的数据:
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 创建