我正在研究Hadley Wickams的书" R 4 Data Science",第13章。它要求计算和可视化美国各个机场的平均航班延误。
设置的初始操作:
library(tidyverse)
library(nycflights13)
这使得5个表可用flights
,planes
,airports
,airlines
和weather
。
我计算每个目的地的平均延迟(省略NA
值,是吗?):
flights2 <- flights %>% group_by(dest) %>%
summarise(avg=mean(dep_delay, na.rm=T)) %>%
left_join(airports, c("dest"="faa"))
flights2 %>%
ggplot(aes(lon, lat)) + geom_point(aes(size=avg)) +
borders("states") +
coord_quickmap()
我的平均值是否正确? 地图中的所有圆圈都不那么大,我怎样才能使它们更好地区分?
答案 0 :(得分:1)
您的问题更像是如何使用ggplot2
使分数更明显。我相信我们可以使用trans_new
包中的scales
函数来定义转换,并将该转换应用于大小范围。
library(tidyverse)
library(nycflights13)
library(scales)
# The same analysis yu did
flights2 <- flights %>% group_by(dest) %>%
summarise(avg=mean(dep_delay, na.rm=T)) %>%
left_join(airports, c("dest"="faa"))
# Use trans_new function from the scale package to define the square transformation
sq_trans <- function(){
trans_new(name = "sq",
transform = function(x) x^2,
inverse = function(x) sqrt(x))
}
# Plot the data
flights2 %>%
ggplot(aes(lon, lat)) +
# Use alpha to make overlaid points apparent
geom_point(aes(size = avg), colour = "red", alpha = 0.5) +
# Apply the sq transformation
scale_size(range = c(1, 6), trans = "sq")
请注意,您可以在range = c(...)
中测试不同的数字而不进行任何转换,但我没有找到合适的值,所以我只使用了默认值。在trans
参数中,我们可以选择许多其他转换,例如log
,log10
,sqrt
...(有关详细信息,请参阅?scale_size
)。再一次,我没有找到一个好的转换,所以我决定定义平方变换,即size = avg ^ 2。请参阅?trans_new
了解如何定义新转化。
最后,因为有很多点叠加在一起,我们可以使用alpha = ...
指定点的透明度,使每个点更清晰。
要显示更多尺寸类,我们可以在breaks
中设置scale_size
来指定断点。
# Plot the data
flights2 %>%
ggplot(aes(lon, lat)) +
# Use alpha to make overlaid points apparent
geom_point(aes(size = avg), colour = "red", alpha = 0.5) +
# Set break points in 5, 10, 20, 30; Apply the sq transformation
scale_size(breaks = c(5, 10, 20, 30), trans = "sq")