2016-04-18 4 views
1

Ich habe ein ggplo Balkendiagramm wie dieseggplot2 Balkendiagramm tick Position und benutzerdefinierte Legende Ausgabe

bar chart

erstellt von

library(lubridate) 
library(ggplot2) 
library(grid) 
library(scales) 

### Set up dummy data. 
dayVec  <- seq(ymd('2016-01-01'), ymd('2016-01-10'), by = '1 day') 
dayCount <- length(dayVec) 
dayValVec1 <- c(0,-0.25,0.15,0.3,0.4,0.10,0.17,0.22,0.50,0.89) 
dayValVec2 <- c(0.15,0.2,-0.17,0.6,0.16,0.41,0.55,0.80,0.90,1.00) 
dayValVec3 <- dayValVec2 
dayDF  <- data.frame(Date = rep(dayVec, 3), 
        DataType = factor(c(rep('A', dayCount), rep('B',  dayCount), rep('C', dayCount))), 
        Value = c(dayValVec1, dayValVec2, dayValVec3)) 

p <- ggplot(dayDF,aes(Date, Value, colour = DataType)) + 
theme_bw() + 
ggtitle("Chart Title \n") + 
scale_color_manual("",values = c("#033563", "#E1E2D2"),labels = c("xxx ", "yyy  ")) + 
geom_rect(aes(xmin = ymd(min(dayDF$Date)), 
      xmax = ymd('2016-01-06'), 
      ymin = -Inf, 
      ymax = Inf 
), fill = "#E1E2D2", alpha = 0.1, colour = "#E1E2D2") + 
geom_bar(stat = "identity", fill = "#033563", colour = "#033563") + 
geom_hline(yintercept = 0, size = 1) + 
scale_x_datetime(expand = c(0,0), labels = date_format('%b-%d'), breaks = date_breaks('1 day')) + 
scale_y_continuous(expand = c(0,0), labels = percent, limits = c(min(dayDF$Value)*1.2, max(dayDF$Value)*1.2)) + 
theme(axis.text.x = element_text(angle = 90), 
    axis.title.x = element_blank(), 
    axis.title.y = element_blank(), 
    panel.grid.minor = element_blank(), 
    panel.grid.major.x = element_blank(), 
    panel.grid.major.y = element_line(size = 0.5, colour = "black"), 
    axis.line = element_line(size = 1), 
    axis.ticks = element_line(size = 1), 
    axis.text = element_text(size = 20, colour = "#033563"), 
    axis.title.x = element_text(hjust = 2), 
    plot.title = element_text(size = 40, face = "bold", colour = "#033563"), 
    legend.position = 'bottom', 
    legend.text = element_text(colour = "#033563", size = 20), 
    legend.key = element_blank(), 
    panel.border = element_rect(colour = "black", fill = NA, size = 1.5) 
) 
p 

ich Probleme haben jetzt, zunächst möchte ich die haben goem_rect, um bei 0 zu beginnen, nicht zentriert auf dem ersten Balken, scheint das Problem hier die Datum x-Achse zu sein. Und zweitens würde Ich mag eine Legende haben, wie diese

legend

am unteren Rand des Diagramms. Ich habe versucht, eine Dummy-Datenreihe zu erstellen, um zwei Legendeneinträge zu erhalten, aber es zeigt nicht einmal die Legende. Ich würde es vorziehen, wenn die Legende manipuliert werden könnte, ohne mit den Daten zu verkehren. Der 'yyy'-Legendeneintrag sollte angeben, was die schattierten Bereiche darstellen. Vielen Dank im Voraus, ich bin ein ziemlich Neuling zu ggplot2. Hier

+0

Ich bekomme diese Fehlermeldung, wenn ich den Code ausführen 'Fehler: Ungültige Eingabe: date_trans arbeitet mit Objekten der Klasse nur Datum' – Dambo

+0

können Sie es erneut versuchen, ich habe scale_x_date in scale_x_datetime geändert. Es funktioniert auf meinem Ende, aber ich weiß, dass es Probleme auf meinem Mac verursacht – ThatQuantDude

+0

leider verschiebt dies nur alles nach rechts, noch bleibt der weiße vertikale Streifen – ThatQuantDude

Antwort

2

ist eine Lösung:

Final plot

  1. 1. Problem mit geom_rect() aufgrund Format.

ich lieber POSIXct, so konnte ich die leicht modifizieren x-Achse:

geom_rect(aes(xmin = as.POSIXct("2015-12-31 12:00:00"), 
     xmax = as.POSIXct("2016-01-06 12:00:00"), 
     ymin = -Inf, 
     ymax = Inf, 
     fill = "#E1E2D2"), 
     color = "#E1E2D2", alpha = 0.1) 

Tipp: Beginnen Sie den "2015-12-31 12:00:00" die geom_rect() zu erweitern und die "2016-01-06 12:00:00" beenden, wenn Sie wollen totaly die Jan füllen 06.


  1. Legend

sollten Sie scale_fill_manual() anstelle von scale_color_manual()
Und müssen Sie innerhalb aes für geom_rect() und geom_bar() das fill Argument setzen.


Code:

library(lubridate) 
library(ggplot2) 
library(grid) 
library(scales) 

dayVec  <- seq(as.POSIXct('2016-01-01'), as.POSIXct('2016-01-10'), by = '1 day') 
dayCount <- length(dayVec) 
dayValVec1 <- c(0,-0.25,0.15,0.3,0.4,0.10,0.17,0.22,0.50,0.89) 
dayValVec2 <- c(0.15,0.2,-0.17,0.6,0.16,0.41,0.55,0.80,0.90,1.00) 
dayValVec3 <- dayValVec2 
dayDF  <- data.frame(Date = rep(dayVec, 3), 
       DataType = factor(c(rep('A', dayCount), rep('B',  dayCount), rep('C', dayCount))), 
       Value = c(dayValVec1, dayValVec2, dayValVec3)) 
dayDF$Date = as.POSIXct(dayDF$Date) 

p <- ggplot(dayDF,aes(Date, Value, colour = DataType)) + 
theme_bw() + 
ggtitle("Chart Title \n") + 
geom_rect(aes(xmin = as.POSIXct("2015-12-31 12:00:00"), 
     xmax = as.POSIXct("2016-01-06 12:00:00"), 
     ymin = -Inf, 
     ymax = Inf, 
     fill = "#E1E2D2"), 
     color = "#E1E2D2", alpha = 0.1) + 
geom_bar(aes(fill = "#033563"), color = "#033563", stat = "identity") + 
geom_hline(yintercept = 0, size = 1) + 
scale_x_datetime(expand = c(0,0), labels = date_format('%b-%d'), breaks = date_breaks('1 day')) + 
scale_y_continuous(expand = c(0,0), labels = percent, limits = c(min(dayDF$Value)*1.2, max(dayDF$Value)*1.2)) + 
theme(axis.text.x = element_text(angle = 90), 
axis.title.x = element_blank(), 
axis.title.y = element_blank(), 
panel.grid.minor = element_blank(), 
panel.grid.major.x = element_blank(), 
panel.grid.major.y = element_line(size = 0.5, color = "black"), 
axis.line = element_line(size = 1), 
axis.ticks = element_line(size = 1), 
axis.text = element_text(size = 20, color = "#033563"), 
axis.title.x = element_text(hjust = 2), 
plot.title = element_text(size = 40, face = "bold", colour = "#033563"), 
legend.position = 'bottom', 
legend.text = element_text(color = "#033563", size = 20), 
legend.key = element_blank(), 
panel.border = element_rect(color = "black", fill = NA, size = 1.5) 
) + 
scale_fill_manual("",values = c("#033563", "#E1E2D2"),labels = c("xxx ", "yyy ")) 
p 

PS: Ich hatte tz = "Europe/Paris" in scale_x_datetime(label = date_format()) angeben richtige Daten zu haben, je nach Standort.

+0

Awesome Dank, genau das, was ich wollte! – ThatQuantDude