【问题标题】:R - One dimensional "Heatmap" for categorial variablesR - 分类变量的一维“热图”
【发布时间】:2019-02-24 13:26:34
【问题描述】:

想要创建一堆 1D 热图:

  1. 显示中心性(例如均值,由高亮表示)
  2. 显示离散度(例如标准偏差,由分级表示)

注意:中心性或分散性不取决于样本量。每个变量的条形长度应该是恒定的,样本大小不是(必要的)。

例如它看起来如何

这里是类似变量的最小示例:

library(plyr)

v1 <- c("yes", "rather no", "yes", "yes", "yes", "rather yes", "rather yes", "rather no", "rather no", "no", "no", "no")
(v1 <- factor(v1, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)) # order factor values & show
# now, one variant how to re-code/transform the _ordered_ factors as/to values
# (you may have a better proposal/oppinion)
(v1n <- sapply(v1, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))) # re-code to numeric & show
(v1n.mean <- mean(v1n)) # calculate mean & show
(v1n.sd   <- sd(v1n))   # calculate standard deviation & show

v2 <- c("rather yes", "rather yes", "rather no", "rather no", "rather no", "rather no", "rather no", "rather no", "rather no")
v2 <- factor(v2, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)
v2
v2n <- sapply(v2, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))
v2n
(v2n.mean <- mean(v2n))
(v2n.sd   <- sd(v2n))

v3 <- c("yes", "yes", "yes", "rather yes", "rather yes", "rather yes", "rather no", "no")
v3 <- factor(v3, levels=c("no", "rather no", "rather yes", "yes"), ordered = TRUE)
v3
v3n <- sapply(v3, function(x) as.numeric(as.character(mapvalues(x, from=c("no", "rather no", "rather yes", "yes"), to=c("0", "0.333", "0.666", "1")))))
v3n
(v3n.mean <- mean(v3n))
(v3n.sd   <- sd(v3n))

【问题讨论】:

  • 示例图片中的连续阴影具有分级,这意味着连续变量。但是您的数据是离散的。您想为每个变量显示四个矩形,还是要将数据视为连续数据并显示密度?
  • @G5W:谢谢!是的,实际上我已经将变量重新编码为:-2 表示“否”,-1 表示“相当不”,1 表示“相当是”,2 表示“是”。在这里,我选择让支持者来决定如何正确地重新编码数据——也许其他人有更好的建议。 (-:
  • 如果您将代码缩进保存在@alex 列表中,则代码缩进需要四个额外的空格 - 这意味着第一级总共需要 8 个空格。或者,使用带反引号的 GH 样式格式。
  • @Zoe:如前所述,我知道如何缩进代码——它根本无法在我的机器上运行(已停用一些 javascript)。如果可能,请自行调整。谢谢(-:
  • 您的意思是对 v3 有不同数量的响应吗?

标签: r ggplot2 plot heatmap


【解决方案1】:

更新答案:
此答案已更新,因为
1.问题中的数据v1、v2、v3已更改
2.增加了三个条的标签

上半部分仍然是原始答案。以下是回应 OP 澄清的新答案。

大部分是原始答案
这是您所要求的。但是,它不能显示不存在的集中趋势。在我们查看图表之后,我将更全面地讨论这一点。在我们查看图表之后,我将更全面地讨论这一点。

这个想法是制作一个空白图,然后为每个变量(v1、v2、v3)绘制一个灰度条。图表上响应数量最少的位置将是黑色的。响应最多的区域将是白色的。在这两者之间,灰度级将与响应的数量成比例地缩放。

## To make it easy to refer to the different variables
Responses = list(v1,v2,v3)

## 100 colors to allow for a lot of continuity
## color 1 is black, color 100 is white
GrayScale = gray.colors(100, start=0.05, end=0.97)

## Make a blank plot
plot(NULL, type="n", xlab="", ylab="", bty="n", xaxt="n", yaxt="n",
    xlim=c(1,4), ylim=c(1,length(Responses)+1))

## Plot all of the bars
for(j in 1:length(Responses)) {
    Tab = table(Responses[[j]])
    Tab = round(99*(Tab-min(Tab))/(max(Tab)-min(Tab)))+1
    x = seq(1,4,0.01)
    Density = round(approx(1:4, Tab , x)$y)

    ## Make a smooth looking bar
    for(i in 1:(length(x)-1))  {
        polygon(c(x[i],x[i],x[i+1],x[i+1]), c(j,j+0.75,j+0.75,j), 
            col=GrayScale[Density[i]], border=NA)
    }
}
## Add labels
text(1:4, 4, levels(v1))
axis(2, at=(1:3)+0.4, labels=c("v1", "v2", "v3"), lwd=0, lwd.ticks=1, las=1)

修改问题的答案
这个答案只是使用均值和标准绘制高斯分布 您计算的偏差。高斯分布的风格是 上一个答案,白色表示平均值,距离最远的点 平均值是黑色的。

Means = c(v1n.mean, v2n.mean, v3n.mean)
SD    = c(v1n.sd, v2n.sd, v3n.sd)

## 100 colors to allow for a lot of continuity
## color 1 is black, color 100 is white
GrayScale = gray.colors(100, start=0.05, end=0.97)

## Make a blank plot
plot(NULL, type="n", xlab="", ylab="", bty="n", xaxt="n", yaxt="n",
    xlim=c(1,4), ylim=c(1,length(Responses)+1))

for(j in 1:length(Responses)) {
    x = seq(1,4,0.03)
    y = dnorm((x-1)/3, Means[j], SD[j])
    y = round(99*(y-min(y))/(max(y)-min(y))) + 1

    for(i in 1:(length(x)-1))  {
        polygon(c(x[i],x[i],x[i+1],x[i+1]), c(j,j+0.75,j+0.75,j), 
            col=GrayScale[y[i]], border=NA)
    }
}
## Add labels
text(1:4, 4, levels(v1))
axis(2, at=(1:3)+0.4, labels=c("v1", "v2", "v3"), lwd=0, lwd.ticks=1, las=1)

【讨论】:

  • 谢谢——真的很好!我添加了更好的例子。请注意,我只想显示 meanstandard deviation。实际分布如何并不重要(即使您的示例非常令人愉悦——请保留它作为其他人的替代变化可能性!)。
  • 能否请您在图表左侧添加“v1”、“v2”、“v3”。谢谢。
  • 将添加均值、标准差和变量名称
  • 谢谢,真好(-:是否可以在垂直轴上旋转标签;并在水平轴上添加刻度。
猜你喜欢
  • 1970-01-01
  • 2015-12-27
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多