is it possible to modify xaxis to show only one se

2019-07-16 01:24发布

I have a data frame like this:

Server

     Date     Server  Space
1 2010-01-30 server1       100
2 2010-02-28 Server1       400  
3 2010-03-30 Server1     300
4 2010-04-30 Server2       200
5 2010-05-30 Server2       500  
6 2010-06-30 Server2       300

based on this data frame, I use aggregate to group Harddisk usage by month and store it in a data frame called z, as below. z

  Month   Value
1 2010-01 600
2 2010-02 700
3 2010-03 800
4 2010-04 900
5 2010-05 800
6 2010-06 900

I am trying to create a stack chart on x and put a line on the total based on z on top of the same stack chart using ggplot2.

syntax is below:

I had to do this to avoid (Error: Discrete value supplied to continuous scale)

server$Date<-as.character(server$Date)

then run this:

ggplot(server, aes(Date, Space)) +  geom_bar(aes(fill=Server), stat="identity", position="stack") + theme_bw() + scale_x_discrete(name="Date") + scale_y_continuous("Space") +  opts(axis.title.x = theme_text(face="bold", colour="#990000", size=15),axis.text.x  = theme_text(angle=90), axis.title.y = theme_text(face="bold", colour="#990000", angle=90, size=15)) + geom_smooth(data=z,aes(Month,Value,group=1), method="lm", size=2, color="darkblue") 

This works but on my xaxis, I have two sets of data, which looks very cluttered. Is it possible to hide or suppress the dates from x data frame and only show z$Month on xaxis?

I can use this:

scale_x_date(labels = date_format("%m-%Y")) 

But when I do this, xaxis is now showing 01-1970 for all data points.

*Update * Let me ask this question in other way. I like to create a stack chart and on top of the stack, put a linear line using geom_smooth() to show where the total usage is going. I was thinking use x data frame to build the stack chart, then create another data frame for the total value and create the geom_smooth() line based on the total data frame as z. Doing it this way, puts 2 data values to the xaxis.

Rather than doing it this way, is it possible to draw geom_smooth() on the stack bar based on x data frame?

This is the dput of the data frame:

server <- structure(list(Date = structure(c(1325394000, 1325480400, 1325566800, 
1325653200, 1325739600, 1325826000, 1325912400, 1325998800, 1326085200, 
1326171600, 1326258000, 1326344400, 1326430800, 1326517200, 1326603600, 
1326690000, 1326776400, 1325394000, 1325480400, 1325566800, 1325653200, 
1325739600, 1325826000, 1325912400, 1325998800, 1326085200, 1326171600, 
1326258000, 1326344400, 1326430800, 1326517200, 1326603600, 1326690000, 
1326776400, 1325394000, 1325480400, 1325566800, 1325653200, 1325739600, 
1325826000, 1325912400, 1325998800, 1326085200, 1326171600, 1326258000, 
1326344400, 1326430800, 1326517200, 1326603600, 1326690000, 1326776400, 
1328072400, 1328158800, 1328245200, 1328331600, 1328418000, 1328504400, 
1328590800, 1328677200, 1328763600, 1328850000, 1328936400, 1329022800, 
1329109200, 1329195600, 1329282000, 1329368400, 1329454800, 1328072400, 
1328158800, 1328245200, 1328331600, 1328418000, 1328504400, 1328590800, 
1328677200, 1328763600, 1328850000, 1328936400, 1329022800, 1329109200, 
1329195600, 1329282000, 1329368400, 1329454800, 1328072400, 1328158800, 
1328245200, 1328331600, 1328418000, 1328504400, 1328590800, 1328677200, 
1328763600, 1328850000, 1328936400, 1329022800, 1329109200, 1329195600, 
1329282000, 1329368400, 1329454800, 1330578000, 1330664400, 1330750800, 
1330837200, 1330923600, 1331010000, 1331096400, 1331182800, 1331269200, 
1331355600, 1331442000, 1331524800, 1331611200, 1331697600, 1331784000, 
1331870400, 1331956800, 1330578000, 1330664400, 1330750800, 1330837200, 
1330923600, 1331010000, 1331096400, 1331182800, 1331269200, 1331355600, 
1331442000, 1331524800, 1331611200, 1331697600, 1331784000, 1331870400, 
1331956800, 1330578000, 1330664400, 1330750800, 1330837200, 1330923600, 
1331010000, 1331096400, 1331182800, 1331269200, 1331355600, 1331442000, 
1331524800, 1331611200, 1331697600, 1331784000, 1331870400, 1331956800
), class = c("POSIXct", "POSIXt"), tzone = ""), Server = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("ServerA", "ServerB", 
"ServerC"), class = "factor"), Space = c(100, 110, 110, 120, 
120, 130, 130, 140, 140, 150, 150, 160, 160, 170, 170, 180, 200, 
220, 240, 260, 280, 300, 320, 340, 360, 380, 400, 420, 440, 460, 
480, 500, 520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720, 
740, 760, 780, 800, 820, 840, 860, 880, 100, 110, 110, 120, 120, 
130, 130, 140, 140, 150, 150, 160, 160, 170, 170, 180, 200, 220, 
240, 260, 280, 300, 320, 340, 360, 380, 400, 420, 440, 460, 480, 
500, 520, 540, 560, 580, 600, 620, 640, 660, 680, 700, 720, 740, 
760, 780, 800, 820, 840, 860, 880, 550, 110, 560, 120, 570, 130, 
580, 140, 590, 150, 600, 160, 610, 170, 620, 180, 200, 550, 570, 
590, 610, 630, 650, 670, 690, 710, 730, 750, 600, 620, 640, 660, 
680, 700, 720, 740, 760, 780, 800, 820, 840, 860, 880, 900, 920, 
940, 960, 980, 1000, 1020, 1000)), .Names = c("Date", "Server", 
"Space"), row.names = c(NA, 153L), class = "data.frame")



z <- structure(list(Month = c("2012-01", "2012-02", "2012-03"), Value = c(21140, 
21140, 32010)), .Names = c("Month", "Value"), row.names = c(NA, 
-3L), class = "data.frame")

标签: r ggplot2
1条回答
戒情不戒烟
2楼-- · 2019-07-16 02:11

Since you are working with dates (and not DateTimes), you'll find it easier if both your date columns are as.Date objects:

server$Date <- as.Date(server$Date)
z$Month <- as.Date(paste0(z$Month, "-01"))

ggplot(server, aes(Date, Space)) +  
  geom_bar(aes(fill=Server), stat="identity", position="stack") +
  geom_point(data=z,aes(Month,Value,group=1), color="darkblue") +
  geom_line(data=z,aes(Month,Value,group=1), color="darkblue")

enter image description here

查看更多
登录 后发表回答