2016-05-12 2 views
0

J'ai cette image créée avec la fonction table.CalendarReturns du package PerfomanceAnalytics (les noms usuels sont les mois et les colnames sont les années):R - Comment colorer de manière conditionnelle les valeurs d'un data.frame et créer un graphique

tabRet 

> 
gen feb mar apr mag giu lug ago set ott nov dic System 
2004 0.0 3.5 2.9 2.0 1.1 -0.4 1.2 3.3 0.9 1.8 3.0 -0.6 20.1 
2005 1.6 2.3 -1.2 4.0 0.0 1.6 -1.4 2.4 0.7 2.9 2.9 0.4 17.3 
2006 0.8 2.7 0.3 1.4 6.2 -2.6 2.1 2.8 0.5 0.3 0.7 3.1 19.6 
2007 1.3 0.1 1.4 0.1 1.6 -1.0 1.0 1.5 -0.7 1.0 1.3 -0.7 7.0 
2008 1.4 -1.2 2.2 1.2 -0.3 -0.8 2.2 0.4 1.1 0.1 4.4 -1.3 9.7 
2009 4.8 3.2 1.6 3.5 0.7 1.7 2.1 2.2 2.5 1.9 1.5 2.8 32.4 
2010 3.5 0.5 0.4 1.3 1.8 3.8 3.7 3.0 1.1 1.2 3.9 3.4 31.2  
2011 4.3 2.1 1.6 -0.8 3.9 1.5 4.0 5.4 2.3 2.9 0.2 1.5 33.0 
2012 1.1 1.9 -0.1 2.3 1.0 3.6 1.5 0.7 0.0 1.5 1.2 0.5 16.3 
2013 0.8 2.5 1.2 1.4 0.0 1.7 2.3 1.7 0.5 0.2 1.3 0.6 15.1 
2014 0.1 0.7 0.3 -0.7 1.0 1.0 0.2 0.9 -0.7 2.3 1.4 1.4 8.2 
2015 2.3 1.0 1.1 3.1 4.5 -0.7 -0.3 2.3 2.4 0.4 -1.3 1.0 16.7 
2016 2.1 2.5 0.9 1.0 0.2 NA NA NA NA NA NA NA 7.0 

Je voudrais créer un terrain avec quelque chose comme cela pour les couleurs des numéros: ifelse(values< 0,'red','black').

J'ai essayé avec la fonction addtable2plot, du paquet plotrix avec de mauvais résultats. Des conseils sur ce problème? Merci d'avance les gars.

EDIT: je besoin de quelque chose comme ça, mais avec les nombres négatifs en rouge:

textplot(Hmisc::format.df(tabRet, na.blank=TRUE, numeric.dollar=FALSE, cdec=rep(1,dim(tabRet)[2])), rmar = 0.8, cmar = 1, max.cex=.9, halign = "center", valign = "center", row.valign="center", wrap.rownames=20, wrap.colnames=10, col.colnames="Darkblue",col.rownames="Darkblue", mar = c(0,0,4,0)+0.1) title(main="Calendar Monthly Returns",col.main="Darkblue", cex.main=1) 

PLOT

+0

Utilisez ggplot (bibliothèque: 'ggplot2'). Vous pouvez créer une variable 'c <-ifelse (valeurs <0, 'a', 'b')', puis utiliser cette variable dans 'color =' dans ggplot. Voir ceci pour plus de compréhension: http://zevross.com/blog/2014/08/04/beautiful-plotting-in-ra-ggplot2-cheatsheet-3/ –

+0

Cependant, si vous utilisez 'ggplot', vous aurez certainement besoin de remodeler vos mois en format long, voir 'tidyr :: gather' ou' reshape2 :: melt'. – Gregor

+0

est-ce que cela me permet de tracer cette table sous cette forme? Parce que pour tracer cette table j'ai essayé: textplot (Hmisc :: format.df (tabRet, na.blank = VRAI, numeric.dollar = FAUX, cdec = rep (1, dim (tabRet) [2])), rmar = 0.8, cmar = 1, max.cex = .9, halign = "centre", valign = "centre", row.valign = "centre", wrap.rownames = 20, wrap.colnames = 10, col.colnames = "Darkblue", col.rownames = "Darkblue", mar = c (0,0,4,0) +0,1) titre (main = "Calendrier des rendements mensuels", col.main = "Darkblue", cex.main = 1) –

Répondre

1

Il suffit d'ajouter col.data=ifelse(tabRet<0,'red','black'), après col.rownames="Darkblue", à votre code

+0

Merci beaucoup, c'est ce que je cherchais! –

0

Voici une solution en utilisant geom_tile{ggplot2} avec un exemple reproductible:

# load libraries 
    library(ggplot2) 
    library(ggthemes) 
    library(data.table) 
    library(PerformanceAnalytics) 

# load data 
    data(managers) 
    df <- as.data.frame(t(table.CalendarReturns(managers[,c(1,7,8)]))) 

# Convert row names into first column 
    df <- setDT(df, keep.rownames = TRUE)[] 
    setnames(df, "rn", "month") 

# reshape your data 
    df2 <- melt(df, id.var = "month") 

# Plot 
ggplot(df2, aes(x=month, y=variable)) + 
     geom_tile(fill= "white", color = "white") + 
     geom_text(aes(label=value, color= value < 0)) + 
     scale_color_manual(guide=FALSE, values=c("red", "black")) + 
     theme_pander() + 
     theme(axis.text = element_text(face = "bold")) + 
     ggtitle("Calendar Monthly Returns") 

enter image description here

Vous pouvez également choisir de remplir les mosaïques au lieu du texte.

ggplot(df2) + 
    geom_tile(aes(x=month , y=variable, fill= value < 0), color = "gray70", alpha = 0.7) + 
    scale_fill_manual(guide=FALSE, values=c("red", "black")) + 
    theme_pander() 

enter image description here

Dans tous les cas, cette réponse fournit une approche générale aux couleurs conditionnelles dans ggplot.

ggplot(mtcars, aes(wt, mpg)) + 
    geom_point(aes(color= ifelse(mpg > 20, "A", "B"))) + 
    scale_color_manual(guide=FALSE, values=c("red", "black")) 

enter image description here

Vous pouvez aussi le faire en utilisant base:

plot(mtcars$wt, mtcars$mpg, 
    col=ifelse(mtcars$mpg > 20 ,"red", "black")) 
+0

Pas exactement, j'ai édité ma réponse originale avec plus de détails. –

0

Si c'est ce que vous cherchez:

require(tidyr) 
require(ggplot2) 
d<-data.table(gen=seq(2004,2016,1),Jan=round(rnorm(13)),Feb=round(rnorm(13)),Mar=round(rnorm(13))) 
gd<-gather(d,key=gen) 
gd$col<-ifelse(gd$value<0.5,"1","0") 
ggplot(data=gd,aes(x=gen,y=value,color=col))+geom_tile(aes(fill=col))+ 
    scale_fill_manual(values=c("red","black")) 

enter image description here

+0

Pas exactement, j'ai édité ma réponse originale avec plus de détails. –