come fare un (ggplot) diagramma linea con diversi segmenti di colore condizionali in direzione

StackOverflow https://stackoverflow.com/questions/1545591

  •  20-09-2019
  •  | 
  •  

Domanda

Come per Shanes eccellente soluzione di un'altra domanda, ora mi rendo conto che io non so come fare questo.

Il mio approccio originale era quella di utilizzare fondere i dati (grazie ancora Shane):

dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm <- merge(dm1, dm2)

E poi fare la trama:

ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))

Ma non funziona (tutti i singoli pezzi della linea andando "up" dovrebbe essere rosso, il tutto andando "verso il basso" dovrebbe essere di colore verde):

BTW: si fa il dispositivo png insistere su geom_point? http://wana.dk/wp-content/uploads/2009/10/damn.png

(bonus domanda 1:?. Come posso usare espandersi per espandersi solo a destra (dove i miei etichette 'a))

(bonus domanda 2: Sia png e pdf dispositivo si presenta come sopra - vale a dire con geom_points - questo non succede sul mio schermo)

Questo è il mio dati:

d <- structure(list(Type = structure(c(8L, 21L, 23L, 20L, 6L, 14L, 
3L, 24L, 2L, 28L, 32L, 22L, 15L, 29L, 1L, 17L, 18L, 33L, 25L, 
13L, 30L, 11L, 26L, 9L, 12L, 4L, 5L, 27L, 16L, 19L, 10L, 31L, 
7L), .Label = c("Alvorligere vold", "Andre strafferetlige særlove", 
"Andre tyverier", "Bedrageri", "Brandstiftelse", "Butikstyverier m.v.", 
"Dokumentfalsk", "Færdselslovovertræd. i øvrigt", "Færdselsuheld med spiritus", 
"Falsk forklaring i øvrigt", "Forbr. mod off. myndighed m.v.", 
"Freds- og ærekrænkelser", "Hæleri", "Hærværk", "Indbrud i bank, forretn. m.v.", 
"Indbrud i fritidshuse, garager mv", "Indbrud i villaer, lejligheder mv", 
"Love vedr. forsvaret og lign.", "Love vedr. spil, bev., næring", 
"Lov om euforiserende stoffer", "Mangler ved køretøj", "Røveri", 
"Simpel vold", "Spiritus- og promillekørsel", "Trusler", "Tyv./brugstyv. af andet", 
"Tyv./brugstyv. af cykel", "Tyv./brugstyv. af indr. køretøj", 
"Tyv/brugstyv. af knallert", "Tyveri fra bil, båd m.v.", "Ulovlig omgang med hittegods", 
"Våbenloven", "Vold o.l. mod off. myndighed"), class = "factor"), 
I.alt = c(16137L, 9519L, 5930L, 5502L, 4887L, 3582L, 3101L, 
1738L, 1660L, 1649L, 1551L, 1412L, 1338L, 1164L, 1154L, 1057L, 
931L, 907L, 857L, 724L, 681L, 644L, 641L, 505L, 450L, 419L, 
405L, 328L, 324L, 324L, 320L, 281L, 262L), idx06 = c(1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), idx07 = c(0.972675591417568, 
0.766866371450899, 0.931743805516597, 0.813047711781889, 
0.88728323699422, 0.96420233463035, 0.855743544078362, 1.03710247349823, 
0.751470588235294, 0.90443686006826, 0.808403361344538, 0.902834008097166, 
0.718181818181818, 0.904555314533623, 1.02717391304348, 0.68957345971564, 
1.10324483775811, 0.93030303030303, 0.805309734513274, 0.843003412969283, 
0.74914089347079, 0.824786324786325, 1.04060913705584, 1.09150326797386, 
0.977941176470588, 0.892405063291139, 0.966666666666667, 
0.828125, 0.696, 0.813559322033898, 0.697841726618705, 0.88235294117647, 
0.62280701754386), idx08 = c(0.986612873647533, 0.712685595207085, 
0.840579710144927, 0.865628042843233, 0.93757225433526, 0.823346303501945, 
0.905609973285841, 1.03356890459364, 0.689705882352941, 0.909556313993174, 
0.798319327731092, 0.955465587044534, 0.714545454545455, 
0.620390455531453, 1.10869565217391, 0.815165876777251, 0.64306784660767, 
0.818181818181818, 0.722713864306785, 0.627986348122867, 
0.59106529209622, 0.927350427350427, 1.21319796954315, 1.20915032679739, 
1.33088235294118, 0.759493670886076, 1.40833333333333, 0.734375, 
0.896, 0.932203389830508, 0.60431654676259, 0.872549019607843, 
0.675438596491228), farve1 = c("green", "green", "green", 
"green", "green", "green", "green", "red", "green", "green", 
"green", "green", "green", "green", "red", "green", "red", 
"green", "green", "green", "green", "green", "red", "red", 
"green", "green", "green", "green", "green", "green", "green", 
"green", "green"), farve2 = c("red", "green", "green", "red", 
"red", "green", "red", "green", "green", "red", "green", 
"red", "green", "green", "red", "red", "green", "green", 
"green", "green", "green", "red", "red", "red", "red", "green", 
"red", "green", "red", "red", "green", "green", "red")), .Names = c("Type", 
"I.alt", "idx06", "idx07", "idx08", "farve1", "farve2"), class = "data.frame", row.names = c(NA, -33L))
È stato utile?

Soluzione

la stampa non ha funzionato perché si aveva solo due variabili di colore, ma tre valori di dati. L'aggiunta di una terza variabile colore come imbottitura sembra fare il trucco. geom_line prende il colore dal valore precedente punto dati, quindi l'ultimo valore di "value2" non è usato.

d$farve3<-NA
dm1 <- melt(d[,c("Type","I.alt","idx06","idx07","idx08")], id=c("Type","I.alt"))
dm2 <- melt(d[,c("Type","I.alt","farve1","farve2","farve3")], id=c("Type","I.alt"))
colnames(dm2) <- c("Type", "I.alt", "variable2", "value2")
dm<-cbind(dm1,dm2)
ggplot(dm, aes(x=variable,y=value,group=Type,label=Type,size=I.alt))+
  geom_line(aes(col=value2))+
  geom_text(data=subset(dm, variable=="idx08"),hjust=-0.2, size=2.5)+
  theme_bw()+
  scale_x_discrete(expand=c(0,1))+
  opts(legend.position="none")+
  scale_colour_manual(values=c("green","red"))

Altri suggerimenti

Vorrei solo sottolineare questa domanda relativa. Si tratta di una vero e proprio salto di andare da questa soluzione per risolvere il vostro problema particolare, ma sto postando questo nel caso in cui potrebbe essere utile.

Con questi dati di esempio:

b<-cumsum(rnorm(100))
x<-sample(c(1,2), size=100, replace=TRUE)
t<-1:(length(b))

Qui x rappresenterebbe i vostri valori, b è il colore (salita / discesa), e t è l'asse x. Riformattarlo con fusione:

library(ggplot2)
tmp <- melt(data.frame(cbind(t,b,x)),meas=c("x"))
head(tmp)

E tracciarla:

ggplot(tmp, aes(x=t,groups=variable)) +
        facet_wrap(~variable) +
        geom_path(aes(y=b,colour=factor(value))) +
        labs(x=NULL) 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top