Monthly minimum wages - bi-annual data
Data - Eurostat
Info
Last observation: Semi-annual: 2026S1 (N = 111)
First observation: Semi-annual: 1999S1 (N = 105)
Last data update: 23 jul 2026, 23:19. Last compile: 24 jul 2026, 01:12
Structure
Minimum Wage Trends (EUR)
France, Germany, Spain, Portugal
Code
earn_mw_cur %>%
filter(geo %in% c("FR", "DE", "ES", "PT"),
currency == "EUR") %>%
semester_to_date %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot + geom_line(aes(x = date, y = values, color = color)) +
theme_minimal() + scale_color_identity() + add_4flags +
scale_x_date(breaks = as.Date(paste0(seq(1999, 2100, 2), "-01-01")),
labels = date_format("%Y")) +
xlab("") + ylab("Monthly minimum wage (EUR)") +
scale_y_continuous(labels = scales::dollar_format(suffix = "€", prefix = ""))
Ireland, Netherlands, Luxembourg, Greece
Code
earn_mw_cur %>%
filter(geo %in% c("IE", "NL", "LU", "EL"),
currency == "EUR") %>%
semester_to_date %>%
left_join(colors, by = c("Geo" = "country")) %>%
ggplot + geom_line(aes(x = date, y = values, color = color)) +
theme_minimal() + scale_color_identity() + add_4flags +
scale_x_date(breaks = as.Date(paste0(seq(1999, 2100, 2), "-01-01")),
labels = date_format("%Y")) +
xlab("") + ylab("Monthly minimum wage (EUR)") +
scale_y_continuous(labels = scales::dollar_format(suffix = "€", prefix = ""))
Minimum Wage Increases
png
Code
i_g("bib/eurostat/earn_mw_cur_ex3.png")
2021S2-2023S1
Code
earn_mw_cur %>%
filter(time %in% c("2023S1", "2022S2", "2022S1", "2021S2"),
geo %in% c("AT", "BE", "CY", "DE", "EE", "EL", "ES", "FI", "FR", "IE",
"IT", "LT", "LU", "LV", "MT", "NL", "PT", "SI", "SK"),
currency == "EUR") %>%
filter(!is.na(values)) %>%
spread(time, values) %>%
select(-currency) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
select(Flag, geo, Geo, everything()) %>%
mutate(growth = round(100*(`2023S1`/`2021S2`-1), 1)) %>%
arrange(-growth) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}National currency
Code
earn_mw_cur %>%
filter(time %in% c("2023S1", "2022S2", "2022S1", "2021S2"),
geo %in% c("AT", "BE", "CY", "DE", "EE", "EL", "ES", "FI", "FR", "IE",
"IT", "LT", "LU", "LV", "MT", "NL", "PT", "SI", "SK"),
currency == "NAC") %>%
filter(!is.na(values)) %>%
spread(time, values) %>%
select(-currency) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
select(Flag, geo, Geo, everything()) %>%
mutate(growth = round(100*(`2023S1`/`2021S2`-1), 1)) %>%
arrange(-growth) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}Minimum Wages in Euros
png
Code
i_g("bib/eurostat/earn_mw_cur_ex1.png")
Javascript
Code
earn_mw_cur %>%
filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"),
currency == "EUR") %>%
select(geo, Geo, time, values) %>%
na.omit %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
values = round(values)) %>%
spread(time, values) %>%
arrange(-`2020S1`) %>%
mutate_at(vars(-1, -2), funs(ifelse(is.na(.), "", paste0(., " €")))) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
select(Flag, everything()) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}Map 2010S2
Code
earn_mw_cur %>%
filter(time == "2010S2",
currency == "EUR") %>%
select(geo, Geo, values) %>%
right_join(europe_NUTS0, by = "geo") %>%
filter(long >= -15, lat >= 33) %>%
ggplot(., aes(x = long, y = lat, group = group, fill = values)) +
geom_polygon() + coord_map() +
scale_fill_viridis_c(na.value = "white",
labels = scales::dollar_format(accuracy = 1, prefix = "", suffix = "€"),
breaks = seq(0, 3000, 200),
values = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 1)) +
theme_void() + theme(legend.position = c(0.25, 0.85)) +
labs(fill = "Minimum Wage")
Map 2020S2
Code
earn_mw_cur %>%
filter(time == "2020S2",
currency == "EUR") %>%
select(geo, Geo, values) %>%
right_join(europe_NUTS0, by = "geo") %>%
filter(long >= -15, lat >= 33) %>%
ggplot(., aes(x = long, y = lat, group = group, fill = values)) +
geom_polygon() + coord_map() +
scale_fill_viridis_c(na.value = "white",
labels = scales::dollar_format(accuracy = 1, prefix = "", suffix = "€"),
breaks = seq(0, 3000, 200),
values = c(0, 0.1, 0.2, 0.3, 0.4, 0.5, 1)) +
theme_void() + theme(legend.position = c(0.25, 0.85)) +
labs(fill = "Minimum Wage")
Minimum Wages in PPS
png
Code
i_g("bib/eurostat/earn_mw_cur_ex2.png")
Javascript
Code
earn_mw_cur %>%
filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"),
currency == "PPS") %>%
select(geo, Geo, time, values) %>%
na.omit %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
values = round(values)) %>%
spread(time, values) %>%
arrange(-`2020S1`) %>%
mutate_at(vars(-1, -2), funs(ifelse(is.na(.), "", paste0(., " €")))) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
select(Flag, everything()) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}Minimum Wages in National Currency
Javascript
Code
earn_mw_cur %>%
filter(time %in% c("2000S1", "2005S1", "2010S1", "2015S1", "2020S1"),
currency == "NAC") %>%
select(geo, Geo, time, values) %>%
na.omit %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo),
values = round(values)) %>%
spread(time, values) %>%
arrange(-`2020S1`) %>%
mutate(Geo = ifelse(geo == "DE", "Germany", Geo)) %>%
mutate(Flag = gsub(" ", "-", str_to_lower(Geo)),
Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
select(Flag, everything()) %>%
{if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}