将日期映射到 ggplot2 中的 viridis 色标

Mapping dates to the viridis colour scale in ggplot2

我正在尝试 将日期映射到 ggplot2 中的 viridis 色标 。默认的 ggplot 色标适用于日期。但是我在将它们映射到 viridis 比例时遇到了问题,出现有关 'origin' 未提供给 as.Date.numeric() 的错误(尝试使用 ggplot2::scale_color_gradient() 时出现类似错误)。请参阅下面的 reprex。

关于最有效的排序方法有什么建议吗?


### data
df <- structure(list(height = c(182.87, 179.12, 169.15, 175.66, 164.47, 
158.27, 161.69, 165.84, 181.32, 167.37, 160.06, 166.48, 175.39, 
164.7, 163.79, 181.13, 169.24, 176.22, 174.09, 180.11, 179.24, 
161.92, 169.85, 160.57, 168.24, 177.75, 183.21, 167.75, 181.15, 
181.56, 160.03, 165.62, 181.64, 159.67, 177.03, 163.35, 175.21, 
160.8, 166.46, 157.95, 180.61, 159.52, 163.01, 165.8, 170.03, 
157.16, 164.58, 163.47, 185.43, 165.34, 163.45, 163.97, 161.38, 
160.09, 178.64, 159.78, 161.57, 161.83, 169.66, 166.84, 159.32, 
170.51, 161.84, 171.41, 166.75, 166.19, 169.16, 157.01, 167.51, 
160.47, 162.33, 175.67, 174.25, 158.94, 172.72, 159.23, 176.54, 
184.34, 163.94, 160.09, 162.32, 162.59, 171.94, 158.07, 158.35, 
162.18, 159.38, 171.45, 163.17, 183.1, 177.14, 171.08, 159.33, 
185.43, 162.65, 159.44, 164.11, 159.13, 160.58, 164.88), weight = c(76.57, 
80.43, 75.48, 94.54, 71.78, 69.9, 68.85, 70.44, 76.9, 79.06, 
72.37, 67.34, 92.22, 75.69, 65.76, 72.33, 73.3, 97.67, 72.2, 
75.72, 75.54, 69.92, 90.63, 63.54, 69.57, 74.84, 83.36, 82.06, 
83.93, 79.54, 64.3, 76.72, 96.91, 71.88, 74.04, 70.46, 83.65, 
64.77, 76.83, 67.41, 83.59, 67.99, 65.19, 71.77, 66.68, 69.64, 
72.99, 72.89, 87.23, 70.84, 67.67, 66.71, 73.55, 65.93, 97.05, 
68.31, 67.92, 66.03, 77.3, 88.25, 64.92, 84.35, 69.97, 81.7, 
79.06, 67.46, 90.08, 66.56, 84.15, 68.2, 66.47, 88.82, 80.93, 
65.14, 67.62, 69.96, 90.76, 90.41, 71.47, 68.94, 72.72, 69.76, 
82.11, 69.8, 69.72, 67.81, 70.37, 84.29, 64.47, 82.47, 88.7, 
72.51, 70.68, 73.63, 73.99, 66.21, 70.66, 66.96, 71.49, 68.07
), birth = structure(c(766, 896, 920, 959, 1258, 1277, 815, 1226, 
729, 1295, 854, 682, 811, 690, 741, 1056, 690, 1199, 1133, 1233, 
806, 1097, 838, 1278, 773, 1059, 1373, 1038, 1387, 859, 1343, 
926, 1074, 1366, 784, 1207, 1222, 1150, 965, 862, 819, 1072, 
1238, 1320, 976, 1296, 760, 833, 1295, 767, 1030, 727, 774, 1126, 
1113, 849, 1285, 928, 1247, 799, 1130, 1049, 829, 1318, 790, 
1067, 1013, 831, 936, 841, 781, 1378, 801, 1247, 770, 1372, 1129, 
892, 1172, 720, 982, 884, 1380, 871, 889, 820, 1374, 791, 1271, 
1033, 698, 1185, 1273, 1257, 952, 1048, 904, 906, 1051, 684), class = "Date")), class = "data.frame", .Names = c("height", 
"weight", "birth"), row.names = c(NA, -100L))

### libraries
library(ggplot2)
library(viridis)
#> Loading required package: viridisLite

### plot default colour scale
ggplot(data=df, aes(x = height, y = weight, colour = birth)) + 
    geom_point(size=4)

### plot with viridis colour scale
ggplot(data=df, aes(x = height, y = weight, colour = birth)) + 
    geom_point(size=4) + 
    scale_colour_viridis()
#> Error in as.Date.numeric(value): 'origin' must be supplied

解决方法如下:

将日期转换为数值,然后再将它们分配给颜色美学。在对 scale_colour_viridis() 的调用中,您然后使用相应的中断和标签:

# create equidistant sequence of dates to use as labels
lab_dates <- pretty(df$birth)

ggplot(data=df, aes(x = height, y = weight, colour = as.numeric(birth))) + 
  geom_point(size=4) + scale_colour_viridis(breaks = as.numeric(lab_dates), 
                                            labels = lab_dates)

不需要任何额外变量的替代方法是设置 trans = "date".

ggplot(df, aes(x = height, y = weight, colour = birth)) + 
    geom_point(size = 4) +
    scale_colour_viridis_c(trans = "date")

(使用 {ggplot2} v3.3.2)