【问题标题】:How to add another legend to circular heat map in R如何在 R 中向圆形热图添加另一个图例
【发布时间】:2017-01-06 06:13:41
【问题描述】:

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

我之前从另一个answer 尝试过以下操作:

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)

但是,我没有获得图例,而是收到以下错误消息:

“y”的比例已经存在。为“y”添加另一个比例,即 将替换现有比例。

有什么解决办法吗?

提前致谢!

【问题讨论】:

  • 代码的哪一行添加了另一个图例?
  • 我从这里得到这个代码:stackoverflow.com/questions/13887365/… 最初,我认为这个 scale_y_discrete(breaks=y_breaks, labels=y_labels) 将是另一个图例(左手角,灰色),但它确实不工作..
  • 这似乎不是一个错误,它是一个警告(删除scale_y_discrete(breaks=y_breaks, labels=y_labels) + 以摆脱不必要的)。另外,应该注意您需要为ddply 加载plyr。无论如何,您的解释“告诉我圆形热图的环代表什么的传说”对我来说不太有意义。也许那是我自己的无知,你有你要找的例子吗?戒指有编号吗?如果是这样,那需要额外的代码,而且它的问题与您所问的不同。
  • 嗨@CyrusMohammadian,我已经删除了“ scale_y_discrete(breaks=y_breaks, labels=y_labels) +”并且出现了图例(但是,标签错误)。是的,我确实忘记添加加载 plyr 的代码。感谢您的提醒!一个例子是在这个网站上[链接]stackoverflow.com/questions/13887365/…。 “图例”在第一张图片的左手角。删除“scale_y_discrete(breaks=y_breaks, labels=y_labels) +”后我似乎无法获得正确的标签.. :)
  • @Miyii 你在找什么标签?

标签: r legend heatmap polar-coordinates


【解决方案1】:

我并不完全清楚您在寻找什么,但可能就是这样。 您最初使用scale_y_discrete(breaks=y_breaks, labels=y_labels) 投影到aes(x=Name, y=var2, fill=value) 中的连续变量var2。通过将其更改为scale_y_continuous(breaks=y_breaks, labels=y_labels),您可以获得为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))

更新

我不确定您要在这里做什么 - 这些值在中心不是空白,因为那里有数据,删除 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=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)

【讨论】:

  • 是的!我想我们快到了!不过,我意识到的一件事是nba.m$variable 标签现在出现了,“甜甜圈”(情节中间的洞的大小)似乎消失了!如果 scale_y_continuous(breaks=y_breaks, labels=y_labels) 被注释掉,这个问题就会得到解决(这会阻止标签出现......)
  • @Miyii,很抱歉,我不清楚问题是什么,或者上面的情节如何不符合您的需求......
  • 类似于本网站link 中的情节,情节中间有一个洞。我已经在脚本中说明这个洞的大小是 15,但它没有出现。
猜你喜欢
  • 2021-07-27
  • 2014-09-19
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 2014-01-13
  • 2019-01-27
  • 2019-06-21
  • 1970-01-01
相关资源
最近更新 更多