【问题标题】:Partially color histogram in RR中的部分颜色直方图
【发布时间】:2014-03-18 11:30:17
【问题描述】:

我有一个如图所示的直方图。我希望两个区域中的条分别为红色和绿色,即从 0 到左侧第一个黑色边框的条应为红色,第二个区域中的条应为绿色。 这可以在R中完成吗? 用于获取直方图的代码是

hist(pr4$x[pr4$x[,1]>-2,1],breaks=100)

【问题讨论】:

    标签: r colors histogram


    【解决方案1】:

    最好的方法是让hist 为您进行计算,然后使用hist(再次)进行实际绘图。这是一个例子:

    set.seed(1)
    x <- rnorm(1000)
    h <- hist(rnorm(1000), breaks=50, plot=FALSE)
    cuts <- cut(h$breaks, c(-Inf,-.5,1.75,Inf))
    plot(h, col=cuts)
    

    最后一行中的 .5 和 1.75 是您希望具有不同颜色的阈值。

    注意:我最初的答案使用了barplot,但这种策略使得轴有点难以使用。

    结果如下:

    【讨论】:

    • 您可以只在直方图对象上调用plot,而不是在数据上再次调用hist
    • @Spacedman 哦,天哪,这只是一个错字。我更新了图片,然后在这里更新代码。
    • 我相信这个答案并不完全准确 - 我认为条形图的颜色偏移了 1 - 我将发布一个详细的答案。
    【解决方案2】:

    这是我在cmets中提到的方法:

    制作一些测试数据(你应该在你的问题中这样做!)

    test = runif(10000,-2,0)
    

    让 R 计算直方图但不绘制它:

    h = hist(test, breaks=100,plot=FALSE)
    

    您的直方图分为三个部分:

    ccat = cut(h$breaks, c(-Inf, -0.6, -0.4, Inf))
    

    使用此调色板绘图,将因子隐式转换为数字索引调色板:

    plot(h, col=c("white","green","red")[ccat])
    

    ggplot2 解决方案也可用。

    【讨论】:

    【解决方案3】:

    试试这个:

    hist(pr4$x[pr4$x[,1]>-2,1],breaks=100, col = c(rep("white", 69), rep("green", 15), rep("red", 16)))
    

    您可能需要根据直方图中的中断数调整每种颜色的重复次数。

    【讨论】:

    • 或者使用 plot=FALSE 调用 hist,然后从返回的中断中计算颜色。然后使用 col 参数进行绘图。
    【解决方案4】:

    我多年来一直在使用 @Thomas 的解决方案,但后来发现它并不精确。

    在下面的示例中,我遵循已接受的答案。

    fake_data <- c(0.35, 0.41, 0.41, 0.49, 0.49, 0.49, 0.51, 0.51, 0.59, 0.64, 0.7)
    
    fake_hist <- hist(fake_data, plot = F)
    fake_cuts <- cut(fake_hist$breaks, c(-Inf, 0.5, Inf))
    
    plot(fake_hist, col = fake_cuts)
    

    切割的目的是 0.5,但第三条是黑色的,虽然它应该是红色的。原因是,中断包含所有边界,包括第一个柱的左边界,这意味着有 n+1 个值,其中 n 是直方图中的柱数。对于 n 个条形的着色,只需要正确的边界,因此我们必须排除第一个值。

    fake_data <- c(0.35, 0.41, 0.41, 0.49, 0.49, 0.49, 0.51, 0.51, 0.59, 0.64, 0.7)
    
    fake_hist <- hist(fake_data, plot = F)
    fake_cuts <- cut(fake_hist$breaks[-1], c(-Inf, 0.5, Inf))
    
    plot(fake_hist, col = fake_cuts)
    

    在预期的地方产生颜色分割。

    我在这里发布它是因为我花了很长时间才发现有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-11
      相关资源
      最近更新 更多