ggplot2中x轴的多行标签

时间:2013-08-28 17:55:53

标签: r charts ggplot2 axis-labels

是否可以在R图表中包含多行轴标签?

我想为x轴添加两行标签,因为它出现在下面的链接中 - http://www.rita.dot.gov/bts/airfares/national/chart

在我的代码中,我将所有年度季度组合都包含在x轴标签中。但这使得x轴标签看起来非常混乱。

有没有办法让x轴标签更清晰,更具描述性,最好是出现在上面链接的图表中?

以下是我正在使用的代码 -

national.fare <- read.csv("http://www.rita.dot.gov/bts/airfares/national/csv", 
              header = TRUE)[ , 1:4]

names(national.fare) <- c("Year", "Quarter", "US_Average_Current", "US_Average_Inflation-Adjusted")

# Convert Year and Quarter as characters
national.fare$Year <- as.character(national.fare$Year)
national.fare$Quarter <- as.character(national.fare$Quarter)

# Convert to Long-version
national.fare.long <- melt(national.fare, measure.vars = c("US_Average_Current", "US_Average_Inflation-Adjusted"))

# Combine Year and Quarter for Graph
national.fare.long$Year_Quarter <- as.character(paste(national.fare.long$Year, "Q", national.fare.long$Quarter, sep = ""))


# Chart: National Average Domestic Fare Current and Inflation-Adjusted

p <- ggplot(national.fare.long, aes(x = Year_Quarter, y = value, group = variable))

p + geom_line(aes(color = variable), size = 1.5) +
  scale_color_manual(values = c("navy", "red")) +
  ylim(250, 500) +
  ggtitle("National Average Domestic Fare 1995 - 2013") +
  xlab("Year-Quarter") +
  ylab("Average Domestic Fare") +
  theme(legend.position = "top", 
        legend.key = element_rect(fill = "transparent", color = NA),
        legend.title = element_blank(),
        axis.title = element_text(family = "sans", color = "grey50", face = "bold"),
        axis.line.x = element_line(color = "grey"),
        axis.text.y = element_text(family = "sans"),
        axis.text.x = element_text(family = "sans", face = "plain", hjust = 0, vjust = 1, angle = 285),
        axis.ticks.x = element_line(),
        panel.grid.major.y = element_line(color = "grey", size = 0.5, linetype = "dashed"),
        panel.background = element_rect(fill = "transparent", color = NA),
        plot.background = element_rect(fill = "transparent", color = NA),
        plot.title = element_text(family = "sans", size = 18, face = "bold")) 

2 个答案:

答案 0 :(得分:1)

一种解决方案是专门为您的标签创建一个列:我选择仅包含每四个标签。另请注意,我已添加“\ n”以将标签放在两个不同的行上。最后,您使用scale_x_discrete(labels=national.fare.long$Year_Quarter_lab)添加自定义标签。

library(reshape)
library(ggplot2)
national.fare <- read.csv("http://www.rita.dot.gov/bts/airfares/national/csv", 
              header = TRUE)[ , 1:4]

names(national.fare) <- c("Year", "Quarter", "US_Average_Current", "US_Average_Inflation-Adjusted")

# Convert Year and Quarter as characters
national.fare$Year <- as.character(national.fare$Year)
national.fare$Quarter <- as.character(national.fare$Quarter)

# Convert to Long-version
national.fare.long <- melt(national.fare, measure.vars = c("US_Average_Current", "US_Average_Inflation-Adjusted"))

# Combine Year and Quarter for Graph
national.fare.long$Year_Quarter <- as.character(paste(national.fare.long$Year, "Q", national.fare.long$Quarter, sep = ""))
# Create a vector of labels with every fourth label
skip <- 0:(dim(national.fare.long)[1]-1)%%4
national.fare.long$Year_Quarter_lab <- ifelse(skip==0,as.character(paste(national.fare.long$Year, "\nQ", national.fare.long$Quarter, sep = "")),"")


# Chart: National Average Domestic Fare Current and Inflation-Adjusted

p <- ggplot(national.fare.long, aes(x = Year_Quarter, y = value, group = variable))

p + geom_line(aes(color = variable), size = 1.5) +
  scale_color_manual(values = c("navy", "red")) +
  scale_x_discrete(labels=national.fare.long$Year_Quarter_lab) +
  ylim(250, 500) +
  ggtitle("National Average Domestic Fare 1995 - 2013") +
  xlab("Year-Quarter") +
  ylab("Average Domestic Fare") +
  theme(legend.position = "top", 
        legend.key = element_rect(fill = "transparent", color = NA),
        legend.title = element_blank(),
        axis.title = element_text(family = "sans", color = "grey50", face = "bold"),
        axis.line.x = element_line(color = "grey"),
        axis.text.y = element_text(family = "sans"),
        axis.text.x = element_text(family = "sans", face = "plain", hjust = .5, vjust = 1, angle = 0),
        axis.ticks.x = element_line(),
        panel.grid.major.y = element_line(color = "grey", size = 0.5, linetype = "dashed"),
        panel.background = element_rect(fill = "transparent", color = NA),
        plot.background = element_rect(fill = "transparent", color = NA),
        plot.title = element_text(family = "sans", size = 18, face = "bold")) 

答案 1 :(得分:0)

如果您将季度转换为日期,您可以轻松地将轴的比例更改为您认为看起来不错的任何内容。

将季度更改为日期(我说Q1 = 1月1日,根据需要更改):

library(gsubfn)
national.fare.long$Year_Q_Date <- gsubfn("Q.*", 
    list('Q1' = '-01-01', 'Q2' = '-04-01', 'Q3' = '-06-01', 'Q4' = '-10-01'), 
    national.fare.long$Year_Quarter)
national.fare.long$Year_Q_Date <- as.Date(national.fare.long$Year_Q_Date)
firstObs <- national.fare.long$Year_Q_Date[1]
lastObs <- national.fare.long$Year_Q_Date[length(national.fare.long$Year_Q_Date)]

然后选择您的轴粒度:

dateticks <- seq(firstObs, lastObs, by="8 month")

现在对你的情节稍作修改:

library(scales)

p <- ggplot(national.fare.long, aes(x = Year_Q_Date, y = value, group = variable))

p + geom_line(aes(color = variable), size = 1.5, ) +
  scale_color_manual(values = c("navy", "red")) +
  ylim(250, 500) +
  ggtitle("National Average Domestic Fare 2001 - 2012") +
  xlab("Year-Quater") +
  ylab("Average Domestic Fare") +
  scale_x_date(breaks=dateticks, labels=date_format("%Y %b")) +
  theme(legend.position = "top", 
      legend.key = element_rect(fill = "transparent", color = NA),
      legend.title = element_blank(),
      axis.title = element_text(family = "sans", color = "grey50", face = "bold"),
      axis.line.x = element_line(color = "grey"),
      axis.text.y = element_text(family = "sans"),
      axis.text.x = element_text(family = "sans", face = "plain", hjust = 0, vjust = 1, angle = 285),
      axis.ticks.x = element_line(),
      panel.grid.major.y = element_line(color = "grey", size = 0.5, linetype = "dashed"),
      panel.background = element_rect(fill = "transparent", color = NA),
      plot.background = element_rect(fill = "transparent", color = NA),
      plot.title = element_text(family = "sans", size = 18, face = "bold"))