Make every Nth axis label bold with ggplot2

2020-06-04 04:54发布

Is it possible to make every Nth tick on an axis bold using ggplot2? I only want to have the axis tick bold (the small line), not the text.

This would be useful for highlighting every 7th tick when showing daily data in a plot. I'd like to keep the tick marks for every day.

I haven't been able to find anything regarding this topic, any help would be appreciated!

EDIT: Here is a code example. I've extended it at the last line to increase the size of all ticks. What I'd like is to have every Nth label larger. For example every 7th. Defining every 7th one manually wouldn't work since I'm working with data that changes every day.

library(ggplot2)
library(lubridate)
theme_set(theme_bw())

df <- economics_long[economics_long$variable %in% c("psavert", "uempmed"), ]
df <- df[lubridate::year(df$date) %in% c(1967:1981), ]

# labels and breaks for X axis text
brks <- df$date[seq(1, length(df$date), 12)]
lbls <- lubridate::year(brks)

# plot
ggplot(df, aes(x=date)) + 
  geom_line(aes(y=value, col=variable)) + 
  labs(title="Time Series of Returns Percentage", 
       subtitle="Drawn from Long Data format", 
       caption="Source: Economics", 
       y="Returns %", 
       color=NULL) +  # title and caption
  scale_x_date(labels = lbls, breaks = brks) +  # change to monthly ticks and labels
  scale_color_manual(labels = c("psavert", "uempmed"), 
                     values = c("psavert"="#00ba38", "uempmed"="#f8766d")) +  # line color
  theme(axis.text.x = element_text(angle = 90, vjust=0.5, size = 8),  # rotate x axis text
        panel.grid.minor = element_blank(),
        axis.ticks.x = element_line(colour = "black", size = 2))  

Solution: Thanks to @Jimbou! Using axis.ticks.x = element_line(colour = "black", size = c(2, rep(1,6))) leads to this. Perfect for daily Data! enter image description here

标签: r ggplot2
1条回答
女痞
2楼-- · 2020-06-04 05:44

You can try:

ggplot(df, aes(x=date, y=value, color=variable)) + 
     geom_line() + 
     scale_color_manual(values = c("#00ba38", "#f8766d")) +
     scale_x_date(date_breaks = "1 year", date_labels ="%Y") +
     theme(axis.ticks.x = element_line(colour = "black", size = c(5, rep(1,5))),
       axis.text.x = element_text(angle = 90, vjust=0.5, size = c(15,rep(8,5))))

enter image description here

used every 6th and text size for illustration purposes. You can also use your breaks and labels but then you have to use following instead as you duplicated all breaks and labels and they must priorly removed.

scale_x_date(labels = lbls[!duplicated(lbls)], breaks = brks[!duplicated(lbls)]) 
查看更多
登录 后发表回答