【问题标题】:Multiple variables on same barplot in R with ifelse col statement使用 ifelse col 语句在 R 中的同一条形图上显示多个变量
【发布时间】:2015-09-28 05:12:14
【问题描述】:

我目前有一个大小为 365x8(365 天,8 个变量)的数据矩阵。每一天的值代表一个真值或假值,对于每一天,如果为真,我想绘制一个红色框,如果为假,我想绘制一个绿色框。

我的目标是在条形图中显示矩阵的所有 8 列。以下是我拥有的一些当前代码。

data # matrix with size 365x8
# Plot good vs. bad data
first <- barplot(data, xlab = "# of Days", ylab = "Type of Data",
    col=ifelse(data==TRUE, "red", "green"), beside=FALSE, horiz=TRUE,
    xlim=c(0,365))
print(first)

我希望 'col' 的 ifelse 语句转到 'data' 中每一列的每个值,并确定每天的每个值应该是哪种颜色。我的问题是我只能让我的条形图绘制数据(data [,1])中的第一个变量,并且它对所有八个变量都重复此操作。我需要多次调用 barplot (尝试过,没有用),还是完全调用其他东西?我会发布我当前进度的图,但我还没有足够的声誉。

如果我不够清楚,请告诉我,尽我所能描述我在做什么。

【问题讨论】:

    标签: r plot


    【解决方案1】:

    您是否考虑过使用ggplot2 并创建“热图”类型图(使用geom_tile)?我举了一个例子,dat 是你的数据矩阵,所有的值都是 0 或 1。

    ggplot(melt(dat), aes(x=Var2, y=Var1, fill=factor(value))) +
      geom_tile() +
      scale_fill_manual(values=c('green', 'red'))
    

    编辑:您还需要使用 reshape2 包中的 melt。这是我随机使用的数据,以及生成的部分图:

    dat <- replicate(8, sample(c(0, 0, 0, 1), 365, replace=T))
    ggplot(melt(dat[1:50, ]), aes(x=Var2, y=Var1, fill=factor(value))) +
      geom_tile() +
      scale_fill_manual(values=c('green', 'red'))
    

    【讨论】:

    • 这是一个很好的解决方案,但您应该添加您使用的数据(即使 OP 没有)并提及您还使用了reshape2
    • 也是一种更简单的数据生成方式:dat &lt;- replicate(8, sample(c(0, 0, 0, 1), 365, replace = T))
    • 啊,我知道有更好的方法可以做到这一点,但不记得replicate 返回一个数组。为简单起见进行了编辑。
    • 我知道ggplot,但还没用过。我会试一试,让你们知道。谢谢!
    • 当你调用melt并插入'dat'时,'dat'必须是特定的数据类型吗? 'dat' 在您的示例中以数字形式输入。
    【解决方案2】:

    您也可以在基数 R 中使用 heatmap() 执行此操作。不过,它仅适用于数值,因此您需要先将 TRUE/FALSE 值转换为数字。此外,要使图中的行和列的顺序与矩阵中的顺序相同,您需要在对heatmap() 的调用中关闭重新排序。所以是这样的:

    data.num <- ifelse(data == TRUE, 1, 0)
    heatmap(data.num, Rowv = NA, Colv = NA, col = ifelse(z==1, "gray15", "gray85"))
    

    【讨论】:

    • 我尝试了你的方法,它绘制了,但它非常混乱。这与重新排序有关吗?
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多