R ggplot2 x轴显示不正确

时间:2021-08-01 20:11:10

My question is in the following.
here is my raw data:

我的问题在下面。以下是我的原始数据:

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

I use it to plot a line graph with gglot2.

我用它来画一个有gglot2的线形图。

The code is:

的代码是:

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

R ggplot2 x轴显示不正确

My question:
how to let my x-axis to display like month(1,2,3....,12)?
and how can I combine year and month showing on x-axis at the same time.(Jan2016, Feb2016,.....) or (2016/1, 2016/2,.....)

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

very appreciate.

非常欣赏。

2 个解决方案

#1


1  

Create date_label column as Date class in the dataframe using ymd() from lubridate package.

使用lubridate包中的ymd()将date_label列创建为dataframe中的Date类。

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

Manipulate x axis using scale_x_date()

使用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" )

R ggplot2 x轴显示不正确

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

R ggplot2 x轴显示不正确

#2


1  

For the first case, you can convert month to be a factor. The following code would eliminate decimals in the month.

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

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

R ggplot2 x轴显示不正确

To get numeric months you have to have a new column. I will create a new one using dplyr package and change that.

要获得数字月份,必须有一个新的列。我将使用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))

R ggplot2 x轴显示不正确

#1


1  

Create date_label column as Date class in the dataframe using ymd() from lubridate package.

使用lubridate包中的ymd()将date_label列创建为dataframe中的Date类。

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

Manipulate x axis using scale_x_date()

使用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" )

R ggplot2 x轴显示不正确

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

R ggplot2 x轴显示不正确

#2


1  

For the first case, you can convert month to be a factor. The following code would eliminate decimals in the month.

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

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

R ggplot2 x轴显示不正确

To get numeric months you have to have a new column. I will create a new one using dplyr package and change that.

要获得数字月份,必须有一个新的列。我将使用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))

R ggplot2 x轴显示不正确