簡體   English   中英

ggplot2:熱圖中的平均行

[英]ggplot2: A mean row in heatmaps

假設我使用函數geom_raster() (來自ggplot2 )創建了一個熱圖。

在表格底部添加一行的智能方法是什么(在我的情況下),在所考慮的時間內每個月的“平均回報”?

如果在1985年至2013年期間和平均行之間留下一些空間,那將是很好的,也許警察顏色和“案例”可以定制。

我的代碼的核心如下( molten的對象包含我的數據,最初是通過reshape2melt()函數傳遞的矩陣。

hm <- ggplot(data = molten, aes(x = factor(Var2, levels = month.abb), y=Var1, fillll=value)) + geom_raster()
hm <- hm + scale_fill_gradient2(low=LtoM(100), mid=Mid, high=MtoH(100))
hm <- hm + labs(fill='% Return')
hm <- hm + geom_text(aes(label=paste(sprintf("%.1f %%", value))), size = 4)
hm <- hm + scale_y_continuous(breaks = 1985:2013)
hm <- hm + xlab(label = NULL) + ylab(label = NULL)
hm <- hm + theme_bw()
hm <- hm + theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90))

圖片

它不是很簡潔,但我認為這應該做你需要的。

你沒有提供數據集,所以我做了一些。 此外, LtoMMtoH功能不包含在我能找到的任何R包中,所以我做了一個快速的谷歌搜索,並在這里找到它們

下面的代碼生成一個帶有facets的圖hm2 ,以使底部的“Mean Return”行:

require(reshape2)
require(ggplot2)

# Random data
set.seed(100)
casted = data.frame(Var1 = rep(1985:2013, times=12), Var2 = rep(month.abb, each=29), return = rnorm(12*29, 0, 9))
molten = melt(casted, id.vars = c("Var1", "Var2"))

LtoM <-colorRampPalette(c('red', 'yellow' ))
Mid <- "snow3"
MtoH <-colorRampPalette(c('lightgreen', 'darkgreen'))

# Averages
monthly.avg = cbind(Var1 = rep("Mean", 12), dcast(molten, Var2 ~ ., mean))
colnames(monthly.avg)[3] = "Mean"
molten2 = merge(molten, melt(monthly.avg), all.x = TRUE, all.y = TRUE)

# New plot
hm2 = 
  ggplot(data = molten2, aes(x = factor(Var2, levels = month.abb), y=Var1, fill=value)) +
  geom_raster() +
  scale_fill_gradient2(low=LtoM(100), mid=Mid, high=MtoH(100)) +
  labs(fill='% Return') +
  geom_text(aes(label=paste(sprintf("%.1f %%", value))), size = 4) +
  xlab(label = NULL) + ylab(label = NULL) +
  theme_bw() +
  theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90)) +
  facet_grid(variable ~ ., scales = "free_y", space = "free_y") +    # grid layout
  theme(strip.background = element_rect(colour = 'NA', fill = 'NA'), strip.text.y = element_text(colour = 'white'))    # remove facet labels

給出了以下情節:

繪制平均行

這個怎么樣:

我創建了一個網格來模擬你的數據

主要變化是預先計算聚合和“spacer”數據行,並添加到熔化,然后添加scale_y_discrete,以便您可以標記行,然后確保格式適用於沒有%標簽的灰色間隔條(代碼中的注釋)

如果您在問題中包含數據(或樣本),將來會更容易

情節

require(ggplot2)

molten<-expand.grid(c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),1985:2013,0)
colnames(molten)<-c("Var2","Var1","value")
molten$value=(runif(nrow(molten))*60)-30

#create means
means<-aggregate(molten[,c(1,3)], by=list(molten$Var2),FUN=mean, na.rm=TRUE)
colnames(means)<-c("Var2","Var1","value")
means$Var1<-"MEANS"

#create spacer bar
spacer<-means
spacer$Var1<-" "
spacer$value<-NA

#append them to the data
molten<-rbind(molten,spacer,means)


hm <- ggplot(data = molten, aes(x = Var2, y=Var1, fill=value)) + 
geom_raster() +
# replaced your functions for ease of use
scale_fill_gradient2(low="red", mid="yellow", high="green",na.value="grey") +
labs(fill='% Return') +
# don't format the NA vals with %, return blank
geom_text(aes(label=ifelse((is.na(value)),"",paste(sprintf("%.1f %%", value)))), size = 4) +
# make the scale discrete to add labels and enforce order (use a blank space for the spacer)
scale_y_discrete(limits = c("MEANS"," ",1985:2013)) +
xlab(label = NULL) + ylab(label = NULL) +
theme_bw() +
theme(axis.text.x = element_text(size = 10, hjust = 0, vjust = 0.4, angle=90))

hm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM