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

R - How to conditionally color the values of a data.frame and make a plot

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

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

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

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

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

这是一个使用 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")

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

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

无论如何,这个答案提供了 ggplot.

中条件颜色的一般方法
ggplot(mtcars, aes(wt, mpg)) +
  geom_point( aes(color= ifelse(mpg > 20, "A", "B")) )  +
  scale_color_manual(guide=FALSE, values=c("red", "black")) 

您也可以使用 base:

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

如果这正是您要找的:

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

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

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

[数据我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