谷歌趋势数据可视化

谷歌趋势数据可视化

本文是Did you say eclipse?的学习笔记,这个作者的图表绘制的都非常漂亮,所以打算把他的博客上的文章都学习一下,这篇文章介绍了如何把谷歌搜索趋势的数据绘制到美国地图上。

在2017年8月21日,有一场日食,很多谷歌用户都在谷歌上对这次日食的相关情况进行了搜索,这个搜索趋势数据可以在谷歌趋势上获得。很多人对这一数据进行了可视化,例如Two Minutes Of Darkness With 20,000 Strangers

实际上这个网站上还有很多非常有意思的数据,且网站上的图表都制作非常精良。

最有意思的莫过于这个川普的支持率和反对率数据了:

这个页面还能爬到美国历届总统的支持率和反对率数据。

还有就是谷歌图表:

下面让我们用R来绘制这幅图。

首先就是数据获取了:
数据集下载地址:

首先是获取和整理数据:

R
1
2
3
4
5
6
7
8
9
10
11
12
library(tidyverse)
library(fuzzyjoin)
library(hrbrthemes)
library(raster)
# 谷歌趋势数据
gtrends <- read_csv("geoMap.csv")
# 城市数据
us_cities <- read_csv("uscitiesv1.4.csv")
us_cities$name <- paste(us_cities$city, us_cities$state_id)
# shp文件
path.m <- shapefile("~/Desktop/eclipse2017_shapefiles/center17.shp")
path.points <- fortify(path.m)

整理数据:

因为DMA变量是城市区域,也就是像“广州-深圳 广东”这样的,所以可以从中提取州名,然后使用“-”进行分割再unnest。

R
1
2
3
4
5
6
7
8
9
10
11
12
13
# 获取DMA变量的最后两个字符作为州名
gtrends$state <- substr(gtrends$DMA, nchar(gtrends$DMA)-1, nchar(gtrends$DMA))
gtrends <- gtrends %>%
arrange(-row_number()) %>%
mutate(DMA = strsplit(as.character(DMA), "-")) %>%
unnest(DMA)
# 新生成的一些DMA后面没有州名,所以需要进行判断再为没有的添加上。(之所以这么做的原因是,us_citites数据集中的name变量也是这样的)
gtrends$name <- ifelse(
substr(gtrends$DMA,
nchar(gtrends$DMA) - 1,
nchar(gtrends$DMA)) == gtrends$state,
gtrends$DMA, paste(gtrends$DMA, gtrends$state)
)

fuzzyjoin::stringdist_left_join可以将两个数据集进行模糊连接,下面的语句将gtrends和us_cities进行模糊连接并生成一个dist变量表示两个数据集的name变量的差异字符数量。

R
1
2
3
4
first <- stringdist_left_join(gtrends, us_cities, by = c('name'), distance_col = 'dist')

# 筛选出匹配无差异的行
trends <- subset(first, dist <= 0 & state == state_id)

最后就可以绘图了:

R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
labels <- subset(trends, trends$`Solar eclipse: (7/25/17 - 8/1/17)` >= 83)
us <- map_data('county')
ggplot(trends, aes(lng, lat)) +
geom_polygon(
data = us,
aes(x = long, y = lat, group = group),
color = '#dedede',
fill = NA, alpha = 0.45,
cex = 0.35,
show.legend = F) +
geom_point(
aes(color = `Solar eclipse: (7/25/17 - 8/1/17)`, size = `Solar eclipse: (7/25/17 - 8/1/17)`),
alpha = 0.55,
show.legend = F) +
geom_line(data = path.points,
aes(x = long, y = lat),
color = '#c52828',
size = 4, alpha = 0.25,
show.legend = F) +
geom_line(data = path.points,
aes(x = long, y = lat),
color = '#c52828', size = 1,
alpha = 0.75, show.legend = F) +
scale_color_gradient(low = 'white', high = '#444444') +
theme_ipsum(grid = F,
plot_title_family = 'STSongti-SC-Bold',
subtitle_size = 10,
base_family = 'STSongti-SC-Bold') +
theme(axis.title.x = element_blank(),
axis.text.x = element_blank(),
axis.ticks.x = element_blank(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()) +
xlim(-135, -65) + ylim(20, 50) +
labs(title = "日食的谷歌趋势",
subtitle = "2017年7月25日到8月1日",
caption = "数据来源:Google Trends(搜索数据)\nNASA(日食路径数据)") +
geom_text(data = labels,
aes(label = name.x,
size = 14),
family = 'STKaiti') +
theme(legend.position = "none")

# R

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×