2013-08-28 143 views
2

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

我想包括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

如果你在标签中使用'“\ n”'作为分隔符,它们应该出现在两行 – baptiste

+0

另一个选择是在图表的底部创建一个表格,该表格可以包含尽可能多的行。要做到这一点,请按照以下示例进行操作:http://learnr.wordpress.com/2009/04/29/ggplot2-labelling-data-series-and-adding-a-data-table/ – amzu

+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")) 
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"))