So much time since my last post so I want to post something, no matter what it is, but I hope this will be somehow helpfull
In this post I will show some new features for the next version of highcharter package. The main feature added is hc_add_series now is a generic function! This mean you can add the data argument can be numeric, data frame, time series (ts, xts, ohlc) amonth others so the syntaxis will be a little cleaner.
What we’ll do here? We’ll make an interactive version of the well-well-know-and-a-little-repeated Tufte weather chart.
But our focus will be replicate the New York Time App: How Much Warmer Was Your City in 2015? where you can choose among over 3K cities!. So let’s start. So we need a interactive charting library and shiny.
Data
If you search/explore in the devTools in the previous link you can know where is the path of the used data. So to be clear:
All the data used in this post is from http://www.nytimes.com – Me.
We’ll load the tidyverse, download the data, and create an auxiliar variable dt to store the date time in numeric format.
We’ll select the temperature columns from the data and do some wrangling, gather, spread, separate and recodes to get a nice tidy data frame.
Code
dtempgather<-data%>%select(dt, starts_with("temp"))%>%select(-temp_rec_high,-temp_rec_low)%>%rename(temp_actual_max =temp_max, temp_actual_min =temp_min)%>%gather(key, value,-dt)%>%mutate(key =str_replace(key, "temp_", ""))dtempspread<-dtempgather%>%separate(key, c("serie", "type"), sep ="_")%>%spread(type, value)temps<-dtempspread%>%mutate( serie =factor(serie, levels =c("rec", "avg", "actual")), serie =fct_recode(serie, Record ="rec", Normal ="avg", Observed ="actual"))temps
# A tibble: 1,095 × 4
dt serie max min
<dbl> <fct> <dbl> <dbl>
1 1420070400000 Observed 39 27
2 1420070400000 Normal 39 28
3 1420070400000 Record 62 -4
4 1420156800000 Observed 42 35
5 1420156800000 Normal 39 28
6 1420156800000 Record 68 2
7 1420243200000 Observed 42 33
8 1420243200000 Normal 39 28
9 1420243200000 Record 64 -4
10 1420329600000 Observed 56 41
# ℹ 1,085 more rows
Now whe can add this data to the highchart object using hc_add_series:
Code
hc<-hc%>%hc_add_series(temps, type ="columnrange",hcaes(dt, low =min, high =max, group =serie), color =c("#ECEBE3", "#C8B8B9", "#A90048"))hc
A really similar chart of what we want!
The original chart show records of temprerature. So we need to filter the days with temperature records using the columns temp_rec_high and temp_rec_low, then some gathers and tweaks. Then set some options to show the points, like use fill color and some longer radius.
Code
records<-data%>%select(dt, temp_rec_high, temp_rec_low)%>%filter(temp_rec_high!="NULL"|temp_rec_low!="NULL")%>%mutate_if(is.character, str_extract, "\\d+")%>%mutate_if(is.character, as.numeric)%>%gather(type, value,-dt)%>%filter(!is.na(value))%>%mutate(type =str_replace(type, "temp_rec_", ""), type =paste("This year record", type))pointsyles<-list( symbol ="circle", lineWidth =1, radius =4, fillColor ="#FFFFFF", lineColor =NULL)records
# A tibble: 9 × 3
dt type value
<dbl> <chr> <dbl>
1 1439769600000 This year record high 95
2 1441670400000 This year record high 97
3 1446768000000 This year record high 74
4 1449964800000 This year record high 67
5 1450051200000 This year record high 67
6 1450137600000 This year record high 68
7 1450915200000 This year record high 72
8 1451001600000 This year record high 66
9 1424390400000 This year record low 2
Code
hc<-hc%>%hc_add_series(records, "point", hcaes(x =dt, y =value, group =type), marker =pointsyles)hc
We’re good.
Precipitation
A nice feture of the NYTs app is and the chart is show the precipitaion by month. This data is in other axis. So we need to create a list with 2 axis using the create_yaxis helper and the adding this axis to the chart.
The 2 axis are ready, now we need add the data. We will add 12 series -one for each month- but we want to asociate 1 legend for all these 12 series, so we need to use id and linkedTo parameters and obviously. That’s why the id will be a 'p' for the firt element and then NA to the other 11. And then linked this 11 to the first series (id = 'p').
Code
precip<-select(data, dt, precip_value, month)hc<-hc%>%hc_add_series(precip, type ="area",hcaes(dt, precip_value, group =month), name ="Precipitation", color ="#008ED0", lineWidth =1, yAxis =1, fillColor ="#EBEAE2", id =c("p", rep(NA, 11)), linkedTo =c(NA, rep("p", 11)))
The same way we’ll add the normal precipitations by month.
Curious how the chart looks? Me too! Nah, I saw the chart before this post.
Code
hc
Shiny App
With R you can create a press style chart with some wrangling and charting. Now with a little of love we can make the code resuable to make a shiny app.
Someone put the grid lines for the 2 axis as the original NYT app please to these charts! I will grateful if someone code that details.