R - 如何有条件地为data.frame的值着色并制作绘图

时间:2016-05-12 16:00:26

标签: r colors dataframe performanceanalytics

我使用PerfomanceAnalytics包中的函数table.CalendarReturns创建了这个数据框(rownames是年份,colnames是几个月):

tabRet

> 
 gen  feb  mar  apr  may  jun  jul  aug sep  oct nov  dec 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

我想为这些数字的颜色创建一个类似于此的图:ifelse(values< 0,'red','black')

我尝试使用addtable2plot函数,来自plotrix包,效果不佳。 关于这个问题的任何提示?提前谢谢你们。

编辑: 我需要这样的东西,但是负数用红色表示:

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

4 个答案:

答案 0 :(得分:2)

以下是使用geom_tile{ggplot2}的可重复示例的解决方案:

# 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

您也可以选择填充图块而不是文本。

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

无论如何,这个答案提供了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

您也可以使用base

执行此操作
plot(mtcars$wt, mtcars$mpg, 
     col=ifelse( mtcars$mpg > 20 ,"red", "black") )

答案 1 :(得分:2)

只需在col.data=ifelse(tabRet<0,'red','black'),之后将col.rownames="Darkblue",添加到您的代码

即可

答案 2 :(得分:0)

如果您正在寻找:

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

答案 3 :(得分:0)

我不知道我是否找到了解决方案,我希望这段代码可以为您服务此代码接收一个data.frame并将其转换为条件格式,单元格的值显示在列中

[Data i a data.frame][1] [1]:https://i.stack.imgur.com/jETa8.png

pmensual <- readXL("D:precipitacion mensual 
2021/Base de Datos Precipitación mensual .xls",
                   rownames=FALSE, header=TRUE, na="", sheet="Preci_mes", 
                   stringsAsFactors=TRUE)

nba.m <- melt(pmensual)
nba.s <- ddply(nba.m, .(variable), transform)
ggplot(nba.s, aes(variable, Nombre)) + 
   geom_tile(aes(fill = value), colour = "white") +
   #scale_colour_gradientn(colours = c("blue", "green", "red"))+
   scale_fill_gradient2(low = "white", high = "red", mid = "blue", midpoint = 400) +
   geom_text(aes(label = round(value, 1)), size= 3.5, vjust = 0.4)+
   scale_x_discrete("Mes", expand = c(0, 0)) + 
   scale_y_discrete("Estaciones", expand = c(0, 0)) + 
   theme( legend.position="bottom", legend.title=element_text(), panel.background = 
   element_rect(fill = "white", colour = "gray"),
          panel.grid.major = element_line(colour = "gray"))+
   
   labs(title = "Mapa de Calor Precipitaciones en la zona de Estudio",
        subtitle = "Precipitacion Acumulada al mes" , fill = "Precipitacion mm" )

[结果][2] [2]:https://i.stack.imgur.com/FVYV4.png