4 Data retrieval and plotting
The examples used in this section (excluding the plotly interactive plots at the bottom) can all be found in a complete RMarkdown file called “SingleDocument.Rmd” in one of my other GitHub repositories, here.
4.1 Example data sourcing and manipulation
One of the benefits of online database API access is that you can readily source up to date data directly from web locations without having to save files locally in advance.
Most of the major data providers have easy to handle R packages for directly importing data while building your document. The following code chunk requires several packages to be installed:
4.1.1 Loading the required packages
The first sapply
function is just a nice abbreviation that can be used to run the require
command for all of the packages listed in the preceding vector. It can of course be modified to run any function.
The second part is particularly useful when writing PDF documents, as you can set the standard chunk options up front in your document and adjust all image settings at once if you choose to change your document setup.
These packages are mostly used in setting up additional plot options for ggplot 2 for aesthetic purposes, like controlling the colour palette, the location and size of the legend etc. All of that plotting code is included just before the plots below.
4.1.2 Collecting the data from the Danmarks Statistik API
#########################################################################
# Danmarks statistik example
#########################################################################
# This uses a package called statsDK, which needs to be built from Mikkel Krogsholm's the GitHub repo.
#
# install.packages("devtools")
# library(devtools)
# devtools::install_github("mikkelkrogsholm/statsDK")
# Fetching interest rate data, and filter for mortgage products
#########################################################################
<- data.table(sdk_retrieve_data(table_id = "DNRNURI",
dk_mortgage_interest_raw_data DATA = paste0(c("AL51EFFR", "AL51BIDS"),collapse = ","),
INDSEK = paste0(c("1400"),collapse = ","),
VALUTA = "z01",
= "ALLE",
LØBETID1 RENTFIX = paste0(c("1A", "2A", "3A", "5A", "10A", "S10A"),collapse = ","),
LAANSTR = "ALLE",
Tid = "*")) %>%
select(-c(VALUTA, LØBETID1, LAANSTR, INDSEK)) %>%
#mutate(Value = str_replace_all(INDHOLD, pattern = "..", "")) %>%
mutate(Value = as.double(INDHOLD, na.rm = TRUE)/100,
RENTFIX = str_replace_all(RENTFIX, pattern = " - - ", "")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = " - ", "")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "- ", "")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "Over 6 months and up to and including 1 year", "01 year")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "Over 1 year and up to and including 2 years", "02 year")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "Over 2 years and up to and including 3 years", "03 year")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "Over 3 years and up to and including 5 years", "05 year")) %>%
mutate(RENTFIX = str_replace_all(RENTFIX, pattern = "Over 5 years and up to and including 10 years", "10 year")) %>%
mutate(Interest_Fixation = str_replace_all(RENTFIX, pattern = "Over 10 years", "Fixed")) %>%
mutate(Date = str_replace_all(TID, pattern = "M", "")) %>%
mutate(Date = paste0(Date, "01")) %>%
mutate(Date = as.Date(Date,format='%Y%m%d')) %>%
mutate(Interest_Fixation = factor(Interest_Fixation, order = TRUE,
levels = c("01 year",
"02 year",
"03 year",
"05 year",
"10 year",
"Fixed"))) %>%
select(-INDHOLD, -RENTFIX, -TID) %>%
filter(!is.na(Value))
<- dk_mortgage_interest_raw_data %>%
DK_yield_curves_rates filter(DATA != "Administration rate (per cent) (not indexed)",
!is.na(Value)) %>%
select(-DATA)
4.1.3 Adding some extra plotting options
This section includes some additional code that makes writing a document a little more user friendly.
The first part includes some directory specifications, based on the location that the user saves this file.
The second part includes a number of ggplot2 theme and colour palette modifications that can be modified for personal preference.
- The line-width for all line plots in the document.
- Palettes with shades of red, black, blue for 4 5 and 6 variables.
- A mixed colour palette of 10 colours for categorical variables.
- Alternative legend placements inside the plotting area. (This saves a lot of space in the final document).
- Percentage formats that work with latex and ggplot2.
- Simplified command to introduce dashed lines for 5 and 6 variables.
- A theme adjustment to reduce font size in all plots.
#########################################################################
# Set up some extra features for plots that will be used later
= 0.85
plot_line_width
#########################################################################
# Set colour palettes
#########################################################################
<- c("0, 0, 0",
blackpalette "125, 125, 125",
"75, 75, 75",
"225, 30, 0")
<- c("0, 50, 130",
bluepalette "0, 170, 255",
"0, 200, 255",
"0, 55, 255")
<- c("255, 45, 0",
redpalette "255, 200, 0",
"255, 155, 0",
"255, 100, 0")
<- c("0, 0, 0",
blackpalette_five "185, 190, 200",
"115, 115, 115",
"75, 75, 75",
"225, 30, 0")
<- c("0, 50, 130",
bluepalette_five "0, 150, 255",
"0, 175, 255",
"0, 200, 255",
"0, 55, 255")
<- c("255, 45, 0",
redpalette_five "255, 200, 0",
"255, 175, 0",
"255, 145, 0",
"255, 100, 0")
<- c("0, 50, 130",
blackpalette_six "0, 0, 0",
"185, 190, 200",
"115, 115, 115",
"75, 75, 75",
"225, 30, 0")
<- c("0, 50, 130",
bluepalette_six "0, 100, 255",
"0, 130, 255",
"0, 165, 255",
"0, 200, 255",
"0, 55, 255")
<- c("255, 45, 0",
redpalette_six "255, 240, 0",
"255, 210, 0",
"255, 180, 0",
"255, 155, 0",
"255, 100, 0")
<- c("91, 163, 111",
randompalette "84, 135, 158",
"76, 99, 143",
"204, 157, 2",
"156, 0, 0",
"110, 99, 194",
"11, 132, 176",
"237, 133, 28",
"23, 87, 11",
"49, 163, 79")
<- sapply(strsplit(blackpalette, ", "), function(x)
blackpalette rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(bluepalette, ", "), function(x)
bluepalette rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(redpalette, ", "), function(x)
redpalette rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(blackpalette_five, ", "), function(x)
blackpalette_five rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(bluepalette_five, ", "), function(x)
bluepalette_five rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(redpalette_five, ", "), function(x)
redpalette_five rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(blackpalette_six, ", "), function(x)
blackpalette_six rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(bluepalette_six, ", "), function(x)
bluepalette_six rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(redpalette_six, ", "), function(x)
redpalette_six rgb(x[1], x[2], x[3], maxColorValue=255))
<- sapply(strsplit(randompalette, ", "), function(x)
randompalette rgb(x[1], x[2], x[3], maxColorValue=255))
#########################################################################
# Define random colours for plots and theme settings
#########################################################################
<- c("91, 163, 111",
random_srv_palette "84, 135, 158",
"156, 0, 0",
"204, 157, 2",
"110, 99, 194",
"11, 132, 176",
"76, 99, 143",
"237, 133, 28",
"23, 87, 11",
"11, 132, 176",
"49, 163, 79")
<- sapply(strsplit(random_srv_palette, ", "), function(x)
random_srv_palette rgb(x[1], x[2], x[3], maxColorValue = 255))
#########################################################################
# Set plot options
#########################################################################
# Create alternative legend placements inside the plots
<- theme(legend.spacing = unit(0.02, "cm"),
legend_bottom_right_inside legend.background = element_rect(colour = "white", size = 0.1),
legend.key.size = unit(0.5, 'lines'),
legend.justification=c(1,0),
legend.position=c(1,0))
<- theme(legend.spacing = unit(0.02, "cm"),
legend_top_right_inside legend.background = element_rect(colour = "white", size = 0.1),
legend.key.size = unit(0.5, 'lines'),
legend.justification=c(1,1),
legend.position=c(1,1))
<- theme(legend.spacing = unit(0.02, "cm"),
legend_top_left_inside legend.background = element_rect(colour = "white", size = 0.1),
legend.key.size = unit(0.5, 'lines'),
legend.justification=c(0,1),
legend.position=c(0,1))
<- theme(legend.spacing = unit(0.02, "cm"),
legend_bottom_left_inside legend.background = element_rect(colour = "white", size = 0.1),
legend.key.size = unit(0.5, 'lines'),
legend.justification=c(0,0),
legend.position=c(0,0))
#########################################################################
# Create percentage number format settings object for plots
#########################################################################
# This setting is specifically important for LaTeX generated PDF documents, as the escape backslashes in the plot text are sometimes not included and the percentage symbol generated \% sometimes can cause errors. This piece of code can be really helpful in eliminating those errors and getting nice percentage symbols on your Y-Axis.
<- scales::percent_format(accuracy = NULL,
pct_scale_settings scale = 100,
prefix = "",
suffix = "\\%",
big.mark = " ",
decimal.mark = ".",
trim = TRUE)
#########################################################################
# Define dash types for plots
#########################################################################
# 0 = blank, 1 = solid, 2 = dashed, 3 = dotted, 4 = dotdash, 5 = longdash, 6 = twodash
<- c("solid", "dashed", "dashed", "2222", "2222")
plt_line_types_5 <- c("solid", "dotdash", "dashed", "dashed", "2222", "2222")
plt_line_types_6
#########################################################################
# Define additional plotting theme settings for server data
#########################################################################
<- theme_minimal() +
theme_extra theme(text = element_text(size=8))+
theme(axis.text.x = element_text(angle=90, vjust=0.5))+
theme(plot.title = element_text(hjust = 0.5))
4.1.4 Plotting the data
Creating a plot for the data depends quite critically on the structure of the data that you provide to the function. ggplot2 is most effective when you keep your data in “long-format,” which basically means that all descriptive and categorising variables have their own columns and the “values” that each observation take are located in a single long column. This is structure is terrible for human comprehension but much easier to process programatically.
The plot that follows is a line plot of Danish interest rates. Note the places where you need to record the “fig.caption” and “caption” labels. fig.cap = "Danish interest rates"
is included in the code chunk, whereas,
caption = "Source: Statistics Denmark (Danmarks Statistik), own calculations"
is included in the labs
options for the plot.
# Plot the data with GGPlot
#########################################################################
<- ggplot() +
DK_rate_curves geom_line(data = DK_yield_curves_rates,
mapping = aes(x = Date,
y = Value,
group = Interest_Fixation,
colour = Interest_Fixation),
lwd = 0.5) +
labs(x = "Interest fixation term", y = "Rate of interest",
caption = "Source: Statistics Denmark (Danmarks Statistik), own calculations") +
scale_colour_manual(values = randompalette) +
#scale_colour_gradient(low = "#ffffff", high = "#050f80") +
#facet_wrap(~Growth) +
scale_y_continuous(labels = pct_scale_settings) +
+
theme_extra theme(legend.direction = "vertical",
legend.box = "horizontal") +
+
legend_top_right_inside guides(col = guide_legend(nrow = 3,
byrow = FALSE,
title = "Interest fixation"))
DK_rate_curves

Figure 4.1: Danish interest rates
4.1.5 Density plots using ggplot2
ggplot2 offers a wide range of automatic image processing options. Including density plots.
<- ggplot() +
density_plot_interest_rates geom_density(data = DK_yield_curves_rates,
mapping = aes(x = Value,
group = Interest_Fixation,
colour = Interest_Fixation)) +
+
theme_extra +
legend_top_right_inside guides(col = guide_legend(nrow = 3,
byrow = FALSE,
title = "Interest fixation"))
density_plot_interest_rates
And the ability to automatically create a tiled “faceted” plot of underlying groupings.
<- ggplot() +
density_plot_interest_rates geom_density(data = DK_yield_curves_rates,
mapping = aes(x = Value,
group = Interest_Fixation,
colour = Interest_Fixation)) +
facet_wrap(~Interest_Fixation) +
+
theme_extra +
legend_top_right_inside guides(col = guide_legend(nrow = 3,
byrow = FALSE,
title = "Interest fixation"))
density_plot_interest_rates
With minor modifications to the aes
(aesthetics) properties, you can automatically change all plots to be filled in for these density plots. The Fill aesthetic is not available for all geom
’s, so you will need to investigate the options for the ones that you are interested in.
You can see that I have also modified the number of rows in the legend to 6, to keep the legend narrower - since it overlaps the data in the top right corner. Additional legend options can be seen here. The identical legend settings and titles for col
and fill
prevent duplicate legends from being created. you can test this out by modifying one of the title texts.
The two options theme_extra
, and legend_top_right_inside
, are created above in the additional charting options section, and illustrate one way to keep your plotting code a little cleaner.
<- ggplot() +
density_plot_interest_rates geom_density(data = DK_yield_curves_rates,
mapping = aes(x = Value,
group = Interest_Fixation,
colour = Interest_Fixation,
fill = Interest_Fixation)) +
facet_wrap(~Interest_Fixation) +
+
theme_extra +
legend_top_right_inside guides(col = guide_legend(nrow = 6,
byrow = FALSE,
title = "Interest fixation"),
fill = guide_legend(nrow = 6,
byrow = FALSE,
title = "Interest fixation"))
density_plot_interest_rates
4.2 Example table
The kableExtra
package provides some exceptionally simple quickformatting options for both html and PDF table generation. (Link to explainer page here)
The above sourced interest rate data can be quickly laid out in a table as follows:
<- DK_yield_curves_rates %>%
pre_created_table arrange(Interest_Fixation) %>%
spread(key = Interest_Fixation, value = Value)
%>%
pre_created_table kbl(caption = "Table of interest rates over time") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
Date | 01 year | 02 year | 03 year | 05 year | 10 year | Fixed |
---|---|---|---|---|---|---|
2013-10-01 | 0.01183 | 0.01369 | 0.01613 | 0.02411 | 0.03282 | 0.04302 |
2013-11-01 | 0.01268 | 0.01185 | 0.01383 | 0.02078 | 0.03044 | 0.04229 |
2013-12-01 | 0.01252 | 0.01243 | 0.01448 | 0.02172 | 0.03067 | 0.04276 |
2014-01-01 | 0.01301 | 0.01459 | 0.01615 | 0.02183 | 0.02997 | 0.04208 |
2014-02-01 | 0.01294 | 0.01124 | 0.01357 | 0.01921 | 0.02680 | 0.04069 |
2014-03-01 | 0.01245 | 0.01155 | 0.01378 | 0.01909 | 0.02347 | 0.03945 |
2014-04-01 | 0.01380 | 0.01083 | 0.01550 | 0.02072 | 0.02705 | 0.03826 |
2014-05-01 | 0.01171 | 0.01405 | 0.01441 | 0.01918 | 0.02486 | 0.03681 |
2014-06-01 | 0.01209 | 0.01131 | 0.01382 | 0.01788 | 0.02397 | 0.03619 |
2014-07-01 | 0.01236 | 0.01295 | 0.01383 | 0.01723 | 0.02286 | 0.03656 |
2014-08-01 | 0.01256 | 0.01288 | 0.01362 | 0.01673 | 0.02114 | 0.03589 |
2014-09-01 | 0.01145 | 0.01181 | 0.01197 | 0.01510 | 0.01968 | 0.03442 |
2014-10-01 | 0.01309 | 0.01376 | 0.01334 | 0.01555 | 0.01891 | 0.03366 |
2014-11-01 | 0.01189 | 0.01186 | 0.01144 | 0.01368 | 0.01763 | 0.03269 |
2014-12-01 | 0.01272 | 0.01406 | 0.01318 | 0.01514 | 0.01804 | 0.03269 |
2015-01-01 | 0.01465 | 0.01474 | 0.01387 | 0.01532 | 0.01654 | 0.03083 |
2015-02-01 | 0.00796 | 0.01023 | 0.01168 | 0.01399 | 0.02812 | |
2015-03-01 | 0.00772 | 0.01024 | 0.01161 | 0.01373 | 0.02872 | |
2015-04-01 | 0.01061 | 0.01187 | 0.01110 | 0.01328 | 0.01633 | 0.02842 |
2015-05-01 | 0.01112 | 0.01465 | 0.01794 | 0.03145 | ||
2015-06-01 | 0.01061 | 0.00975 | 0.01099 | 0.01728 | 0.02083 | 0.03419 |
2015-07-01 | 0.00974 | 0.00938 | 0.01092 | 0.01789 | 0.02276 | 0.03888 |
2015-08-01 | 0.00983 | 0.01130 | 0.01105 | 0.01758 | 0.02313 | 0.03881 |
2015-09-01 | 0.01035 | 0.01043 | 0.01762 | 0.02309 | 0.03896 | |
2015-10-01 | 0.01427 | 0.01412 | 0.01193 | 0.01770 | 0.02328 | 0.03854 |
2015-11-01 | 0.01021 | 0.01576 | 0.02160 | 0.03752 | ||
2015-12-01 | 0.01188 | 0.01065 | 0.01632 | 0.02399 | 0.03803 | |
2016-01-01 | 0.01271 | 0.01328 | 0.01388 | 0.01653 | 0.02127 | 0.03778 |
2016-02-01 | 0.01200 | 0.01513 | 0.01803 | 0.03652 | ||
2016-03-01 | 0.00975 | 0.01159 | 0.01364 | 0.01602 | 0.03576 | |
2016-04-01 | 0.01084 | 0.01364 | 0.01246 | 0.01468 | 0.01983 | 0.03336 |
2016-05-01 | 0.00946 | 0.01117 | 0.01373 | 0.01669 | 0.03237 | |
2016-06-01 | 0.01477 | 0.00825 | 0.01105 | 0.01246 | 0.01613 | 0.03131 |
2016-07-01 | 0.01022 | 0.01225 | 0.01406 | 0.02989 | ||
2016-08-01 | 0.00824 | 0.01149 | 0.01207 | 0.01313 | 0.02893 | |
2016-09-01 | 0.00901 | 0.01058 | 0.01087 | 0.01335 | 0.02803 | |
2016-10-01 | 0.01101 | 0.01521 | 0.01145 | 0.01261 | 0.01594 | 0.02842 |
2016-11-01 | 0.01142 | 0.01265 | 0.01564 | 0.02941 | ||
2016-12-01 | 0.01108 | 0.01058 | 0.01309 | 0.01623 | 0.02955 | |
2017-01-01 | 0.01115 | 0.01296 | 0.01087 | 0.01322 | 0.01767 | 0.03084 |
2017-02-01 | 0.01114 | 0.01247 | 0.01522 | 0.03025 | ||
2017-03-01 | 0.00970 | 0.01283 | 0.03009 | |||
2017-04-01 | 0.00948 | 0.01188 | 0.01063 | 0.01269 | 0.01721 | 0.02911 |
2017-05-01 | 0.01074 | 0.01288 | 0.01486 | 0.02903 | ||
2017-06-01 | 0.00983 | 0.00978 | 0.01229 | 0.01481 | 0.02847 | |
2017-07-01 | 0.00979 | 0.01045 | 0.01330 | 0.01555 | 0.02839 | |
2017-08-01 | 0.00642 | 0.00992 | 0.01147 | 0.01599 | 0.02811 | |
2017-09-01 | 0.00813 | 0.00827 | 0.00896 | 0.01133 | 0.01430 | 0.02817 |
2017-10-01 | 0.01051 | 0.01198 | 0.00972 | 0.01207 | 0.01572 | 0.02818 |
2017-11-01 | 0.00980 | 0.01102 | 0.01558 | 0.02786 | ||
2017-12-01 | 0.00969 | 0.01168 | 0.01617 | 0.02727 | ||
2018-01-01 | 0.01184 | 0.01259 | 0.01004 | 0.01222 | 0.01440 | 0.02779 |
2018-02-01 | 0.00797 | 0.01133 | 0.01348 | 0.01733 | 0.02962 | |
2018-03-01 | 0.00735 | 0.01009 | 0.01266 | 0.01648 | 0.02858 | |
2018-04-01 | 0.01203 | 0.01417 | 0.01113 | 0.01321 | 0.01740 | 0.02882 |
2018-05-01 | 0.01089 | 0.01277 | 0.01802 | 0.02877 | ||
2018-06-01 | 0.00999 | 0.01184 | 0.01618 | 0.02801 | ||
2018-07-01 | 0.01016 | 0.01191 | 0.01795 | 0.02798 | ||
2018-08-01 | 0.01034 | 0.01189 | 0.01579 | 0.02805 | ||
2018-09-01 | 0.01021 | 0.01193 | 0.01631 | 0.02770 | ||
2018-10-01 | 0.00840 | 0.01218 | 0.01017 | 0.01249 | 0.01615 | 0.02816 |
2018-11-01 | 0.01051 | 0.00903 | 0.01195 | 0.01611 | 0.02793 | |
2018-12-01 | 0.01016 | 0.01169 | 0.01498 | 0.02760 | ||
2019-01-01 | 0.00882 | 0.00858 | 0.01002 | 0.01149 | 0.01319 | 0.02674 |
2019-02-01 | 0.00948 | 0.01021 | 0.01274 | 0.02565 | ||
2019-03-01 | 0.00763 | 0.00887 | 0.00901 | 0.01166 | 0.02359 | |
2019-04-01 | 0.01109 | 0.01114 | 0.00881 | 0.00922 | 0.01182 | 0.02202 |
2019-05-01 | 0.00853 | 0.00862 | 0.00998 | 0.02212 | ||
2019-06-01 | 0.00780 | 0.00655 | 0.00608 | 0.00831 | 0.02053 | |
2019-07-01 | 0.00663 | 0.00590 | 0.00828 | 0.01769 | ||
2019-08-01 | 0.00582 | 0.00453 | 0.00626 | 0.01744 | ||
2019-09-01 | 0.00448 | 0.00460 | 0.00728 | 0.01660 | ||
2019-10-01 | 0.00459 | 0.00643 | 0.00576 | 0.00545 | 0.00774 | 0.01609 |
2019-11-01 | 0.00723 | 0.00653 | 0.00817 | 0.01716 | ||
2019-12-01 | 0.00704 | 0.00793 | 0.00746 | 0.00723 | 0.01684 | |
2020-01-01 | 0.00378 | 0.00822 | 0.00772 | 0.00734 | 0.00966 | 0.01772 |
2020-02-01 | 0.00786 | 0.00633 | 0.00777 | 0.01723 | ||
2020-03-01 | 0.00655 | 0.01075 | 0.01116 | 0.01016 | 0.01004 | 0.01729 |
2020-04-01 | 0.00969 | 0.00971 | 0.01035 | 0.01038 | 0.01147 | 0.02249 |
2020-05-01 | 0.01019 | 0.00940 | 0.01047 | 0.01994 | ||
2020-06-01 | 0.00927 | 0.00829 | 0.01004 | 0.01839 | ||
2020-07-01 | 0.00879 | 0.00754 | 0.00941 | 0.01818 | ||
2020-08-01 | 0.00838 | 0.00716 | 0.00801 | 0.01774 | ||
2020-09-01 | 0.00743 | 0.00658 | 0.00786 | 0.01778 | ||
2020-10-01 | 0.00888 | 0.00778 | 0.00633 | 0.00726 | 0.01758 | |
2020-11-01 | 0.00818 | 0.00635 | 0.00675 | 0.01732 | ||
2020-12-01 | 0.00373 | 0.00762 | 0.00671 | 0.01690 | ||
2021-01-01 | 0.00487 | 0.00779 | 0.00823 | 0.00662 | 0.00846 | 0.01507 |
2021-02-01 | 0.00835 | 0.00742 | 0.00796 | 0.01630 | ||
2021-03-01 | 0.01072 | 0.00775 | 0.00763 | 0.01020 | 0.01752 | |
2021-04-01 | 0.00996 | 0.00834 | 0.00822 | 0.00821 | 0.01038 | 0.02004 |
2021-05-01 | 0.00891 | 0.00904 | 0.01161 | 0.02153 | ||
2021-06-01 | 0.00858 | 0.00895 | 0.01223 | 0.02243 | ||
2021-07-01 | 0.00882 | 0.00835 | 0.01134 | 0.02308 | ||
2021-08-01 | 0.00796 | 0.00782 | 0.00929 | 0.02223 | ||
2021-09-01 | 0.00829 | 0.00871 | 0.01115 | 0.02268 |
4.3 Interactive html plots with Plotly
A scatter plot with labels on all points can be easily created (some axis limits for the data were necessary below). I also wanted uniform dot sizes and so simply used Value / Value
which returns 1
for all dot sizes.
library(plotly)
<- as.numeric(min(DK_yield_curves_rates$Date)) * 24 * 60 * 60 * 1000
a <- as.numeric(max(DK_yield_curves_rates$Date)) * 24 * 60 * 60 * 1000
b
<- plot_ly(DK_yield_curves_rates %>%
fig x = ~Date, y = ~Value,
filter, # Hover text:
text = ~paste("Interest rate: ", Value, '%<br>Fixation:', Interest_Fixation),
mode = "markers",
color = ~Value, size = ~Value/Value
%>%
) layout(xaxis = list(range = c(a, b)))
fig
Modifying this plot to return lines, we just need to arrange the data in the correct order to ensure that the lines traced follow the correct pattern.
library(plotly)
<- as.numeric(min(DK_yield_curves_rates$Date)) * 24 * 60 * 60 * 1000
a <- as.numeric(max(DK_yield_curves_rates$Date)) * 24 * 60 * 60 * 1000
b
<- plot_ly(DK_yield_curves_rates %>%
fig arrange(Date),
x = ~Date,
y = ~Value,
color = ~Interest_Fixation,
# Hover text:
text = ~paste("Interest rate: ", Value, '%<br>Fixation:', Interest_Fixation),
mode = 'lines'
%>%
) layout(xaxis = list(range = c(a, b)))
fig