2009-10-09 4 views
4

Comme Shanes excellent solution d'une autre question, je réalise maintenant que je ne sais pas comment faire cela.comment faire un tracé de ligne (ggplot) avec différents segments de couleur conditionnel à la direction

Mon approche originale était d'utiliser fondre les données (grâce SHANE à nouveau):

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) 

Et puis faire le terrain:

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

Mais cela ne fonctionne pas (tous les morceaux de ligne individuels allant "up" devrait être rouge, tout va "vers le bas" devrait être vert):

BTW:does the png device insist on geom_point? http://wana.dk/wp-content/uploads/2009/10/damn.png

(question bonus 1: comment puis-je utiliser expand pour étendre uniquement vers la droite? (Où mes étiquettes »à.))

(question bonus de 2: Les deux dispositif .png et pdf apparaît comme ci-dessus - à-dire avec geom_points - cela ne se produit pas sur mon écran)

Ce Mes données:

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)) 
+0

Le lien vers la photo est cassé (12/10/12) – metasequoia

Répondre

5

Votre fusion ne fonctionne pas parce que vous aviez seulement deux variables de couleur, mais trois valeurs de données. L'ajout d'une troisième variable de couleur comme padding semble faire l'affaire. geom_line prend sa couleur à partir de la valeur du point de données précédent, donc la dernière valeur de "value2" n'est pas utilisée.

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

Cela a fonctionné! Merci beaucoup, Ian. – Andreas

0

Je voudrais juste point out this related question. C'est un vrai saut pour aller de cette solution à la résolution de votre problème particulier, mais je poste ceci au cas où cela pourrait aider.

Avec ces données exemple:

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

ici x représenterait vos valeurs, b est la couleur (montant/descendant), et t est l'axe x. Reformater à la fonte:

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

Et le tracer:

ggplot(tmp, aes(x=t,groups=variable)) + 
     facet_wrap(~variable) + 
     geom_path(aes(y=b,colour=factor(value))) + 
     labs(x=NULL) 
+0

Merci encore Shane. Il semble que geom_path nécessite un tri des données qui serait difficile dans mon cas. – Andreas

Questions connexes