R ggplot2 x轴未正确显示

时间:2017-03-17 06:03:09

标签: r ggplot2 axis axis-labels

我的问题如下 这是我的原始数据:

type,com,year,month,value
A,CH,2016,1,0
A,CH,2016,2,0
A,CH,2016,3,0
A,CH,2016,4,0
A,CH,2016,5,0
A,CH,2016,6,0
A,CH,2016,7,0
A,CH,2016,8,0
A,CH,2016,9,453128
A,CH,2016,10,868256
A,CH,2016,11,1015080
A,CH,2016,12,650912
B,CH,2016,1,0
B,CH,2016,2,0
B,CH,2016,3,0
B,CH,2016,4,0
B,CH,2016,5,0
B,CH,2016,6,61273
B,CH,2016,7,27711
B,CH,2016,8,161780
B,CH,2016,9,48889
B,CH,2016,10,72805
B,CH,2016,11,131466
B,CH,2016,12,73756
C,CH,2016,1,0
C,CH,2016,2,0
C,CH,2016,3,0
C,CH,2016,4,0
C,CH,2016,5,0
C,CH,2016,6,0
C,CH,2016,7,0
C,CH,2016,8,2200
C,CH,2016,9,111384
C,CH,2016,10,28758
C,CH,2016,11,21161
C,CH,2016,12,0

我用它来绘制带有 gglot2 的线图。

代码是:

test <- read.csv("test.csv", header = T)
test_list <- split(test, test$type)
Rplot <- ggplot(test_list$A, aes(x=month, y=value, col=com))+geom_line()
Rplot

Rplot

我的问题:
如何让我的x轴显示如(1,2,3 ....,12)?
如何在x轴上同时显示。(2016年1月,2016年2月,.....)或(2016/2016年,2016年) / 2,.....)

非常感谢。

2 个答案:

答案 0 :(得分:0)

对于第一种情况,您可以将月份转换为一个因素。以下代码将消除月中的小数。

test$month <- as.factor(test$month)
test_list <- split(test, test$type)
Rplot <- ggplot(test_list$A, aes(x=month, y=value, col=com, group = 1))+geom_line()
Rplot

enter image description here

要获得数月,您必须拥有一个新列。我将使用dplyr包创建一个新的包并更改它。

library(dplyr)
# make a new column by joining month after converting it to character and year.
test <- test %>% mutate(exactDate = paste(month.abb[as.numeric(as.character(month))], year, sep=""))

# convert to factor
test$exactDate <- factor(test$exactDate, levels = c("Jan2016","Feb2016","Mar2016","Apr2016","May2016","Jun2016",
                                                    "Jul2016","Aug2016","Sep2016", "Oct2016", "Nov2016", "Dec2016"),
                         labels =  c("Jan2016","Feb2016","Mar2016","Apr2016","May2016","Jun2016",
                                    "Jul2016","Aug2016","Sep2016", "Oct2016", "Nov2016", "Dec2016"))

# Plot similarly
test_list <- split(test, test$type)
Rplot <- ggplot(test_list$A, aes(x=exactDate, y=value, col=com, group = 1))+geom_line()

# Rotate axis labels by 90 degrees
Rplot+ theme(axis.text.x=element_text(angle=90, hjust=1))

enter image description here

答案 1 :(得分:0)

使用date_label包中的Date在数据框中将ymd()列设为lubridate类。

library( 'lubridate' )
test_list <- lapply( test_list, function( x ) { 
  x$date_label <- ymd( paste( x$year, month.abb[ x$month ], 01, sep = "-"))
  x 
  })

使用scale_x_date()

操纵x轴
# 1. date_labels = "%Y/%m"   - 2016/01
# 2. date_labels = "%m"      - 01
# 3. date_labels = "%b %Y"   - Jan 2016        

library( 'ggplot2' )
ggplot( data = test_list$A, aes( x = date_label, y = value, color = com, group = com ) ) +
  geom_line( size = 3 ) + 
  scale_x_date(name = "month",
               date_labels = "%m", 
               date_breaks = "1 month" )

enter image description here

ggplot( data = test_list$A, aes( x = date_label, y = value, group = com, color = com ) ) +
  geom_line(  size = 3 ) + 
  theme( axis.text.x = element_text( angle = 45, hjust = 1 )) +
  scale_x_date(name = "month_year",
               date_labels = "%b %Y", 
               date_breaks = "1 month" )

enter image description here