csstyle standardizes graphs, tables, and reports to
follow the Core Surveillance visual guidelines. The design is
deliberately narrow. The package does not expose every ggplot2 option.
It offers a small set of outputs that look the same, whoever produces
them and whenever.
The package covers four areas.
theme_cs() is the main theme function. It applies the
Core Surveillance appearance to any ggplot2 plot.
# Basic scatter plot with Core Surveillance theme
ggplot(mtcars, aes(x = mpg, y = hp)) +
geom_point() +
theme_cs() +
labs(
title = "Engine Power vs Fuel Efficiency",
x = "Miles per Gallon",
y = "Horsepower"
)A few arguments adjust the layout without breaking the overall style.
# Theme with bottom legend and vertical x-axis labels
ggplot(mtcars, aes(x = factor(cyl), y = mpg, fill = factor(cyl))) +
geom_boxplot() +
theme_cs(legend_position = "bottom", x_axis_vertical = TRUE) +
labs(title = "MPG by Number of Cylinders", fill = "Cylinders")The package ships several predefined palettes. Inspect them directly.
# View available colors
head(colors$named_colors)
#> H1 H2 H3 H4 H5 H6
#> "#393C61" "#0975B5" "#2EA1C0" "#709900" "#B11643" "#FC5F56"
# Display all palettes
display_all_palettes()Apply a palette to a plot with scale_color_cs() or
scale_fill_cs().
# Using the primary color palette
ggplot(mtcars, aes(x = mpg, y = hp, color = factor(cyl))) +
geom_point(size = 3) +
scale_color_cs(palette = "primary") +
theme_cs() +
labs(color = "Cylinders")# Using the warning palette for fills
ggplot(mtcars, aes(x = factor(cyl), fill = factor(cyl))) +
geom_bar() +
scale_fill_cs(palette = "warning") +
theme_cs() +
labs(title = "Car Count by Cylinders", fill = "Cylinders")Every number formatting function belongs to one of two parallel families. The two families reflect the intended audience. The Norwegian family follows domestic conventions. The journal family follows international conventions for academic publications. The “Journal formatting” section below compares the two side by side.
The format_num_as_nor_* functions use a comma for the
decimal separator, a space for thousands, and "IK" (ikke
kjent) for missing values.
# Format numbers with Norwegian conventions
numbers <- c(1234.56, 9876.54, 123.45, NA)
# Basic number formatting (0, 1, 2 decimal places)
format_num_as_nor_num_0(numbers)
#> [1] "1235" "9877" "123" "IK"
format_num_as_nor_num_1(numbers)
#> [1] "1234,6" "9876,5" "123,5" "IK"
format_num_as_nor_num_2(numbers)
#> [1] "1234,56" "9876,54" "123,45" "IK"
# Percentage formatting
percentages <- c(12.34, 56.78, 90.12)
format_num_as_nor_perc_1(percentages)
#> [1] "12,3 %" "56,8 %" "90,1 %"
# Per 100k population rates
rates <- c(123.45, 678.90)
format_num_as_nor_per100k_1(rates)
#> [1] "123,5 /100k" "678,9 /100k"The format_date_as_nor() and
format_datetime_as_nor() functions produce dates in the
Norwegian dd.mm.yyyy style.
# Current date
format_date_as_nor()
#> [1] "26.09.2026"
# Specific dates
test_date <- as.Date("2023-12-25")
format_date_as_nor(test_date)
#> [1] "25.12.2023"
# Datetime formatting
test_datetime <- as.POSIXct("2023-12-25 14:30:00")
format_datetime_as_nor(test_datetime)
#> [1] "25.12.2023 kl. 14:00"
# Filename-safe datetime
format_datetime_as_file(test_datetime)
#> [1] "2023_12_25_143000"For academic publications the package provides a parallel set of
functions. They use a decimal point, a comma thousands separator,
"NA" for missing values, and ISO 8601 dates.
# Compare Norwegian vs Journal formatting
numbers <- c(1234.56, 9876.54, NA)
# Norwegian format (space thousands, comma decimal, "IK" for NA)
format_num_as_nor_num_1(numbers)
#> [1] "1234,6" "9876,5" "IK"
# Journal format (comma thousands, decimal point, "NA" for NA)
format_num_as_journal_num_1(numbers)
#> [1] "1,234.6" "9,876.5" "NA"
# Percentage comparison
percentages <- c(12.34, 56.78)
# Norwegian: "12,3 %" vs Journal: "12.3%"
format_num_as_nor_perc_1(percentages)
#> [1] "12,3 %" "56,8 %"
format_num_as_journal_perc_1(percentages)
#> [1] "12.3%" "56.8%"
# Per 100k comparison
rates <- c(123.45, 678.90)
# Norwegian: "123,5 /100k" vs Journal: "123.5/100k"
format_num_as_nor_per100k_1(rates)
#> [1] "123,5 /100k" "678,9 /100k"
format_num_as_journal_per100k_1(rates)
#> [1] "123.5/100k" "678.9/100k"test_date <- as.Date("2023-12-25")
test_datetime <- as.POSIXct("2023-12-25 14:30:00")
# Norwegian format: "25.12.2023"
format_date_as_nor(test_date)
#> [1] "25.12.2023"
# Journal format (ISO 8601): "2023-12-25"
format_date_as_journal(test_date)
#> [1] "2023-12-25"
# Datetime comparison
format_datetime_as_nor(test_datetime) # "25.12.2023 kl. 14:00"
#> [1] "25.12.2023 kl. 14:00"
format_datetime_as_journal(test_datetime) # "2023-12-25 14:30:00"
#> [1] "2023-12-25 14:30:00"Both families include inverse log transformation variants. Use them when the axis values are on a log scale and you want the labels to show the original units.
log_values <- c(1, 2, 3)
# Log2 transformations (2^1, 2^2, 2^3 = 2, 4, 8)
format_num_as_nor_invlog2_1(log_values) # "2,0", "4,0", "8,0"
#> [1] "2,0" "4,0" "8,0"
format_num_as_journal_invlog2_1(log_values) # "2.0", "4.0", "8.0"
#> [1] "2.0" "4.0" "8.0"
# Log10 transformations (10^1, 10^2, 10^3 = 10, 100, 1000)
format_num_as_journal_invlog10_1(log_values) # "10.0", "100.0", "1,000.0"
#> [1] "10.0" "100.0" "1,000.0"Run help(package = "csstyle") for the full function
list. Individual help pages such as ?theme_cs,
?scale_color_cs and ?format_num_as_nor_num_1
document single functions.