2015-04-28 10 views
10

Ich bin mir nicht sicher, ob geom_bar in der Lage ist (wahrscheinlich bin ich nicht), die Handlung, die ich brauche, mit geom_bar zu erstellen. Ich möchte ein Balkendiagramm, aber nicht beginnend mit 0, ich habe einen minimalen und maximalen Wert, der der Anfangs- und der Endpunkt jedes Balkens sein soll. Gewünschte Ausgabe sieht wie folgt ein: enter image description heregeom_bar von min bis max Datenwert

Datenstruktur ist

dput(datos) 
structure(list(CDG = c("Alicante", "Alicante", "Alicante", "Alicante", 
"Alicante", "Alicante", "Alicante", "Alicante", "Alicante", "Alicante", 
"Alicante", "Castellón", "Castellón", "Castellón", "Castellón", 
"Castellón", "Castellón", "Castellón", "Castellón", "Castellón", 
"Castellón", "Castellón", "Castellón", "Castellón", "Castellón", 
"Castellón", "Castellón", "Castellón", "Castellón", "Valencia", 
"Valencia", "Valencia", "Valencia", "Valencia", "Valencia", "Valencia", 
"Valencia", "Valencia", "Valencia", "Valencia", "Valencia", "Valencia", 
"Valencia", "Valencia", "Valencia", "Valencia", "Valencia", "Valencia", 
"Valencia", "Valencia", "Valencia", "Valencia", "Valencia", "Valencia", 
"Valencia"), ESTACION = structure(c(5L, 1L, 2L, 3L, 8L, 23L, 
24L, 21L, 31L, 22L, 41L, 26L, 12L, 16L, 13L, 14L, 15L, 18L, 28L, 
29L, 19L, 37L, 39L, 27L, 49L, 52L, 53L, 54L, 55L, 4L, 7L, 6L, 
9L, 10L, 11L, 17L, 20L, 33L, 25L, 30L, 32L, 36L, 35L, 34L, 38L, 
42L, 46L, 48L, 47L, 43L, 45L, 44L, 50L, 51L, 40L), .Label = c("Alacant-El_Pla", 
"Alacant-Florida_Babel", "Alacant-Rabassa", "Albalat_dels_Tarongers", 
"Alcoi-Verge_dels_Lliris", "Algar_de_Palancia", "Alzira", "Benidorm", 
"Beniganim", "Bunnol-Cemex", "Burjassot-Facultats", "Burriana", 
"Castello-Ermita", "Castello-Grau", "Castello-Patronat_d.Esports", 
"Castello-Penyeta", "Caudete_de_las_Fuentes", "Cirat", "Coratxar", 
"Cortes_de_Pall", "Elda-Lacy", "El_Pinos", "Elx-Agroalimentari", 
"Elx-Parc_de_Bombers", "Gandia", "L.Alcora", "La_Vall_d.Uix", 
"Morella", "Onda", "Ontinyent", "Orihuela", "Paterna-CEAM", "Quart_de_Poblet", 
"Sagunt-CEA", "Sagunt-Nord", "Sagunt-Port", "Sant_Jordi", "Torrebaja", 
"Torre_Endomenech", "Torrent-El_Vedat", "Torrevieja", "Valencia-Albufera", 
"Valencia-Avd._Francia", "Valencia-Bulevard_Sud", "Valencia-Moli_del_Sol", 
"Valencia-Pista_de_Silla", "Valencia-Politecnic", "Valencia-Vivers", 
"Vilafranca", "Vilamarxant", "Villar_del_Arzobispo", "Vinaros_Planta", 
"Vinaros_Plataforma", "Viver", "Zorita"), class = "factor"), 
    MAXIMO_HORARIO = c(NA, 70.7, 80, 63.7, 93.5, 73.8, 82.3, 
    59, 71, 85.5, 62, 73, 38, 87.2, 89.2, 82, 28.5, 84, 99.5, 
    86, 87, 94, 84, 70, 85.5, 91.2, 85.3, 72.4, 97.5, NA, 63.3, 
    96.2, 81, 68, 72.3, 64.5, 67.4, 59.5, 82.7, 77, 65.5, 89.5, 
    76.5, NA, 80, NA, 65.3, 66.2, 72.5, 65.8, 50.2, 54.8, 71.2, 
    79.5, NA), PROMEDIO_DIARIO = c(NA, 56.8, 64.5, 52.9, 86.9, 
    69.6, 79.4, 59, 73.9, 82.4, 61.4, 62.2, 43.1, 85.1, 55.2, 
    77.7, 26.2, 81.9, 94.3, 85.8, 85.1, 89.8, 80.5, 66.6, 83.3, 
    94.3, 87.5, 72.9, 93.3, 100.3, 60.8, 94.2, 74, 68.4, 62.5, 
    66.7, 66.5, 45.5, 78, 79.4, 68.2, 81.1, 72.6, NA, 77.1, NA, 
    55.1, 54.7, 66.8, 54.1, 49.3, 46.6, 63.9, 81.8, NA), MINIMO_HORARIO = c(NA, 
    26.8, 24.5, 30.2, 62, 46.5, 56.2, 59, 58.2, 67.8, 50.8, 16.7, 
    11.5, 63.2, 2, 62, 18, 75.2, 87.5, 80, 77.8, 83.2, 71.8, 
    52.5, 78.3, 88.9, 83.7, 66.6, 84.3, NA, 26.2, 80, 42, 47.2, 
    8.2, 43, 45.5, 4.5, 47.5, 55.7, 39.8, 68.7, 58.8, NA, 74.3, 
    NA, 11.5, 7.2, 25.5, 18.2, 8.5, 7.2, 14.7, 70.5, NA), MAXIMO_OCTOHORARIO = c(NA, 
    66.1, 81.1, 55.2, 96.9, 79.2, 89.1, NA, 81.1, 90.5, 64.6, 
    79.8, 66.1, 91.4, 80.8, 80.8, 28.4, 83.8, 96.1, 88.3, 88.5, 
    92.3, 82.7, 71.4, 85.6, 97.4, 89.1, 75.5, 95.1, NA, 79.5, 
    100.3, 90.4, 76.1, 83.3, 75.5, 79.7, 66.7, 87.7, 87.5, 78.3, 
    83.8, 76.8, NA, 76.8, NA, 74.5, 73, 81.2, 67.8, 73.1, 69, 
    79.9, 88.2, NA), VARIACION_MAX_HOR = c(NA, -15.1, -7, -21.3, 
    -10.2, -17.2, -18, NA, -18.2, -12.8, -8.2, -23.8, -57.8, 
    -8, 2.7, -1.3, -0.8, -5.7, -1.5, -10.8, -5.8, -0.8, -8.3, 
    -19.7, -6.5, -7.7, -11.9, -16.8, -2.7, NA, -27.7, -19.1, 
    -19.5, -24, -21.7, -28.2, -22.6, -23.7, -17.8, -25, -29.2, 
    -5.2, -19.5, NA, -14.3, NA, -32.2, -20.5, -20.7, -20.4, -38.1, 
    -29, -21.6, -20.5, NA), VARIACION_PRM_DIA = c(NA, -16.2, 
    -10.4, -18.9, -4, -5.8, -7.7, NA, -3, -9.4, 2, -22.9, -27.2, 
    1.1, -4.7, 16.8, -0.9, 0, 0.5, -1.9, 1.3, 15.1, 23.7, -14.1, 
    -4.8, 1.7, 14.8, -8, 14.7, -0.7, -20, -7.6, -17.9, -12.7, 
    -20.7, -10.7, -14.7, -24.3, -9.1, -13.6, -11.8, 18, -10.1, 
    NA, 10.9, NA, -24.4, -20.2, -14.9, -18.7, -25.4, -30, -18.6, 
    -6.7, NA), OSCILACION_DIARIO = c(NA, 43.9, 55.5, 33.5, 31.5, 
    27.3, 26.1, 0, 12.8, 17.7, 11.2, 56.3, 26.5, 24, 87.2, 20, 
    10.5, 8.8, 12, 6, 9.2, 10.8, 12.2, 17.5, 7.2, 2.3, 1.6, 5.8, 
    13.2, NA, 37.1, 16.2, 39, 20.8, 64.1, 21.5, 21.9, 55, 35.2, 
    21.3, 25.7, 20.8, 17.7, NA, 5.7, NA, 53.8, 59, 47, 47.6, 
    41.7, 47.6, 56.5, 9, NA), ESTACIONALIDAD_MAX = c(NA, -43, 
    -37.1, -50.2, -30.3, -46.8, -35.7, -55.6, -44.6, -36.1, -48.1, 
    -45.6, -72.3, -37.5, -29.7, -38.8, -75.3, -38.9, -29.1, -39.4, 
    -36.9, -30.3, -33.6, -42, -40.7, -17.3, -33.4, -46.7, -28.9, 
    NA, -53.2, -22, -41.9, -46.8, -43, -51, -43.6, -50.1, -39.4, 
    -43.3, -45.7, -32.5, -39.8, NA, -35.2, NA, -39.5, -43.3, 
    -39.9, -43.3, -58.1, -50.9, -45, -44.3, NA), ESTACIONALIDAD_MED = c(NA, 
    -15.2, -10.7, -28.9, -4.3, -11, 3.8, -17.6, 20.2, -4.2, -30.9, 
    -10.4, -27.6, 2.7, -0.4, 17.5, -61.5, 4.7, -5.7, 6.1, -12.7, 
    6.9, 18.7, -10.2, -9.1, 30.4, -12, -3.3, 20.2, 32.1, -5.1, 
    22, 2.4, -2.8, -6.9, -18.7, -13.9, -16.2, 10.6, -4.1, 1.5, 
    22.1, 12.9, NA, 12.2, NA, 12.9, -3.7, -1.6, -13.3, -19.3, 
    -25, -15.5, -0.8, NA), X = c(NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
    NA, NA, NA)), .Names = c("CDG", "ESTACION", "MAXIMO_HORARIO", 
"PROMEDIO_DIARIO", "MINIMO_HORARIO", "MAXIMO_OCTOHORARIO", "VARIACION_MAX_HOR", 
"VARIACION_PRM_DIA", "OSCILACION_DIARIO", "ESTACIONALIDAD_MAX", 
"ESTACIONALIDAD_MED", "X"), row.names = c(NA, -55L), class = "data.frame") 

R Skript verwendet, um andere Variablen plotten in dem Datensatz folgt

library(ggplot2) 
library(reshape2) 
library(grid) 
datos=read.csv("previozono.csv",header=T,sep=";", na.strings="-99.9") 

datap1=cbind.data.frame(datos$ESTACION,datos$MAXIMO_HORARIO,datos$PROMEDIO_DIARIO) 
names(datap1) <- c("estacion","Maximo_horario","Promedio_diario") 

dataplot1 <- melt(datap1,id.vars='estacion') 

plot1=ggplot(dataplot1)+ geom_bar(aes(x=estacion,y=value,fill=variable), 
    stat='identity',position='dodge') + xlab(" ") + ylab(" ") + 
    theme(axis.text.x=element_text(angle=80, size=8, hjust=1, vjust=1),legend.position="bottom") + 
    theme(axis.text.y=element_text(size=8)) + 
    scale_y_continuous(limits = c(0,250),breaks=c(0,50,100,150,200,250)) + 
    theme(plot.margin=unit(c(0,1,0,0),"mm")) + 
    ggtitle(paste("Ozono - Máximo horario y promedio diario - ",format(Sys.time(), "%d/%m/%Y"),sep="")) + 
    scale_fill_manual(values=c("#E95875", "#99CCFF")) + labs(fill="") 

Antwort

8

Sie können dies wie folgt mit geom_segment erreichen (Sie werden die Großformatdaten von datap1 für diese Lösung benötigen):

ggplot(datap1) + 
    geom_segment(aes(x=estacion, xend=estacion, y=Promedio_diario, yend=Maximo_horario), size=3, color="orange") + 
    geom_hline(yintercept=mean((datap1$Maximo_horario + datap1$Promedio_diario)/2, na.rm=TRUE), color="red") + 
    theme_bw() + 
    theme(axis.text.x=element_text(angle=90)) 

die gibt:

enter image description here


geom_linerange Mit geben Sie das gleiche Ergebnis:

ggplot(datap1) + 
    geom_linerange(aes(x=estacion, y=average, ymin=Promedio_diario, ymax=Maximo_horario), size=3, color="orange") + 
    geom_hline(yintercept=mean((datap1$Maximo_horario + datap1$Promedio_diario)/2, na.rm=TRUE), color="red") + 
    theme_bw() + 
    theme(axis.text.x=element_text(angle=90)) 

Und wenn Sie den Mittelwert für jeden Takt aufnehmen möchten, geom_pointrange könnte auch eine Option sein.

+2

Danke @jaap eine schöne und funktionierende Lösung. Ich habe noch nie geom_segment verwendet, ggplot2 ist ein tolles Paket – pacomet

+1

@pacomet Ich habe meine Antwort mit zwei anderen Lösungen aktualisiert. – Jaap

7

Hier ist der Anfang:

ggplot(dataplot1,aes(x=estacion,y=value,fill=variable)) + 
    geom_bar(stat='identity') + 
    scale_fill_manual(values=c("white", "#99CCFF")) + 
    theme_classic() 

Stapeln Sie sie dann plotten Sie eine Gruppe als Hintergrund Farbe - weiß:

enter image description here

+1

Hallo @ zx5754 ein interessanter Trick. Aber mein Hintergrund wird nicht weiß sein, also kann ich es nicht benutzen. Vielleicht, wenn es möglich wäre, es transparent zu machen ... aber dann muss die Legende geändert werden. Danke für deine Hilfe – pacomet

+1

Netter Trick. Da @pacomet jedoch die Werte als Minimal- und Maximalwerte verwenden möchte, ist das Stapeln nicht die richtige Lösung i.m.h.o. Das Stapeln der beiden Werte führt zu einem aufgeblähten Maximalwert: 'ymax_actual = ymin + ymax' – Jaap

+1

Ich sagte, es ist ** ein Start **, wollte nur den Trick teilen, natürlich ist es nicht Absicht, unsinnige Daten darüber zu stapeln gegenseitig. Außerdem spreche ich kein Spanisch. :) – zx8754