如何在R中的循环热图中添加另一个图例 [英] How to add another legend to circular heat map in R

查看:62
本文介绍了如何在R中的循环热图中添加另一个图例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想添加另一个图例,以告诉我圆形热图的环代表什么(从外环到内环).

我以前从另一个

更新

我不确定您要在此处执行的操作-这些值在中心不是空白,因为那里有数据,因此删除了 scale_y_continuous(breaks = y_breaks,labels = y_labels)会限制y轴的比例,以便不再绘制日期.这就是为什么在删除该行代码时看不到中间填充的原因.无论如何,如果您要查找的是,则需要做的是删除 scale_y_continuous(breaks = y_breaks,labels = y_labels)并关闭y轴的标签,然后手动进行使用 grob 添加这些标签.我敢肯定,有一种更好的方法可以满足您的需求,但这至少可以帮助您入门.

  p< -ggplot(nba.m,aes(x =名称,y = var2,填充=值))+geom_tile(colour ="white")+geom_text(data = nba.labs,aes(x = Name,y = var2 + 1.5,标签=名称,角度=角度,对齐=对齐),尺寸= 2.5)+scale_fill_gradient(low ="white",high ="steelblue")+ylim(c(0,50))+coord_polar(theta ="x")+主题(panel.background = element_blank(),axis.title = element_blank(),panel.grid = element_blank(),axis.text.x = element_blank(),axis.ticks = element_blank(),axis.text.y = element_text(size = 5))+主题(axis.title.y = element_blank(),axis.text.y = element_blank(),axis.ticks.y = element_blank())lab = textGrob((paste("G MIN PTS FGM FGA FGP FTM FTA FTP X3PM X3PA X3PP ORB DRB TRB AST STL BLK TO PF"),x = unit(.1,"npc"),just = c("left"),gp = gpar(fontsize = 7))gp = ggplotGrob(p)gp = gtable_add_rows(gp,unit(10,"grobheight",lab),-1)gp = gtable_add_grob(gp,实验室,t = -2,l = gp $ layout [gp $ layout $ name =="panel",] $ l)grid.newpage()grid.draw(gp) 

I want to add another legend that tells me what ring of a circular heat map represents (from outer ring to inner ring).

I tried the following from another answer previously:

library(reshape)
library(ggplot2)
library(plyr)

nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")

nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)

nba.m <- ddply(nba.m, .(variable), transform, value = scale(value))

# Convert the factor levels (variables) to numeric + quanity to determine    size   of hole.
nba.m$var2 = as.numeric(nba.m$variable) + 15

# Labels and breaks need to be added with scale_y_discrete.
y_labels = levels(nba.m$variable)
y_breaks = seq_along(y_labels) + 15


nba.labs <- subset(nba.m, variable==levels(nba.m$variable)    [nlevels(nba.m$variable)])

nba.labs <- nba.labs[order(nba.labs$Name),]
nba.labs$ang <- seq(from=(360/nrow(nba.labs))/1.5, to=(1.5* (360/nrow(nba.labs)))-360, length.out=nrow(nba.labs))+80
nba.labs$hjust <- 0
nba.labs$hjust[which(nba.labs$ang < -90)] <- 1
nba.labs$ang[which(nba.labs$ang < -90)] <- (180+nba.labs$ang)[which(nba.labs$ang < -90)]

p2 = ggplot(nba.m, aes(x=Name, y=var2, fill=value)) +
  geom_tile(colour="white") +
  geom_text(data=nba.labs, aes(x=Name, y=var2+1.5,
                           label=Name, angle=ang, hjust=hjust), size=3) +
  scale_fill_gradient(low = "white", high = "steelblue") +
  ylim(c(0, max(nba.m$var2) + 1.5)) +
  scale_y_discrete(breaks=y_breaks, labels=y_labels) +
  coord_polar(theta="x") +
  theme(panel.background=element_blank(),
    axis.title=element_blank(),
    panel.grid=element_blank(),
    axis.text.x=element_blank(),
    axis.ticks=element_blank(),
    axis.text.y=element_text(size=5))
print(p2)

However, instead of getting the legend, I'm having this error message instead:

Scale for 'y' is already present. Adding another scale for 'y', which will replace the existing scale.

Any solutions?

Thanks in advance!

解决方案

It's not entirely clear to me what you're looking for but this may be it. You were originally using scale_y_discrete(breaks=y_breaks, labels=y_labels) to project to a continuous variable,var2, in aes(x=Name, y=var2, fill=value). By changing that to scale_y_continuous(breaks=y_breaks, labels=y_labels) you can get the categorical labels listed for nba.m$variable.

ggplot(nba.m, aes(x=Name, y=var2, fill=value)) +
  geom_tile(colour="white") +
  geom_text(data=nba.labs, aes(x=Name, y=var2+1.5,
                           label=Name, angle=ang, hjust=hjust), size=3) +
  scale_fill_gradient(low = "white", high = "steelblue") +
  ylim(c(0, max(nba.m$var2) + 1.5)) +
  scale_y_continuous(breaks=y_breaks, labels=y_labels) +
  coord_polar(theta="x") +
  theme(panel.background=element_blank(),
    axis.title=element_blank(),
    panel.grid=element_blank(),
    axis.text.x=element_blank(),
    axis.ticks=element_blank(),
    axis.text.y=element_text(size=5))

UPDATE

I'm not sure what you're trying to do here -those values are not blank in the center because there's data there, removing scale_y_continuous(breaks=y_breaks, labels=y_labels) limits the scale of the y-axis such that the date is no longer graphed. That's why you're not seeing the middle filled when that line of code is removed. At any rate, if that's what you're looking for, what you need to do is delete scale_y_continuous(breaks=y_breaks, labels=y_labels) and turn off the labels for the y-axis, then manually add those labels using grob. I'm sure there's a better way to accomplish what you need but this will get you started at least.

p<-ggplot(nba.m, aes(x=Name, y=var2, fill=value)) +
  geom_tile(colour="white") +
  geom_text(data=nba.labs, aes(x=Name, y=var2+1.5,
                           label=Name, angle=ang, hjust=hjust), size=2.5) +
  scale_fill_gradient(low = "white", high = "steelblue") +
  ylim(c(0, 50)) +
  coord_polar(theta="x") +
  theme(panel.background=element_blank(),
    axis.title=element_blank(),
    panel.grid=element_blank(),
    axis.text.x=element_blank(),
    axis.ticks=element_blank(),
    axis.text.y=element_text(size=5))+ theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank())
lab = textGrob((paste("G  MIN  PTS  FGM  FGA  FGP  FTM  FTA  FTP  X3PM X3PA X3PP ORB DRB  TRB  AST  STL  BLK  TO  PF")),
   x = unit(.1, "npc"), just = c("left"), 
   gp = gpar(fontsize = 7))

gp = ggplotGrob(p)
gp = gtable_add_rows(gp, unit(10, "grobheight", lab), -1)
gp = gtable_add_grob(gp, lab, t = -2, l = gp$layout[gp$layout$name == "panel",]$l)

grid.newpage()
grid.draw(gp)

这篇关于如何在R中的循环热图中添加另一个图例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆