在直方图的Y轴上添加一个间断

13

我不太确定如何准确地描述这个效果,但我想实现一种“破碎的直方图”或“轴间隔”效果:http://gnuplot-tricks.blogspot.com/2009/11/broken-histograms.html(示例使用gnuplot),我想在R中实现。

看起来我应该使用plotrix包中的gap.plot()函数,但我只看到了在散点图和折线图上使用它的示例。我已经能够在我的图表周围添加断点并在其中放置一个锯齿形状,但我无法弄清楚如何重新缩放我的坐标轴以便于放大断点以下的部分。

整个重点是能够展示直方图中一个非常大的条形的顶部值,并将其他大量较短的条形放大显示。(是的,我知道这可能会误导人,但如果可能的话,我仍然想这样做)

有什么建议吗?

更新 5/10/2012 1040 EST:

如果我使用数据创建一个普通的直方图并使用<-将其保存到变量中(hdata <- hist(...)),则以下变量的值如下:

hdata$breaks
 [1] 0.00 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33
[16] 0.34 0.35 0.36 0.37 0.38 0.39 0.40 0.41 0.42 0.43 0.44 0.45 0.46 0.47 0.48
[31] 0.49 0.50 0.51 0.52 0.53 0.54 0.55 0.56 0.57 0.58 0.59 0.60 0.61 0.62 0.63
[46] 0.64 0.65 0.66 0.67 0.68 0.69 0.70 0.71 0.72 0.73 0.74 0.75 0.76 0.77 0.78
[61] 0.79 0.80 0.81 0.82 0.83 0.84 0.85 0.86 0.87 0.88 0.89 0.90 0.91 0.92 0.93
[76] 0.94 0.95 0.96 0.97 0.98 0.99 1.00

hdata$counts
 [1]    675      1      0      1      2      2      0      1      0      2
[11]      1      1      1      2      5      2      1      0      2      0
[21]      2      1      2      2      1      2      2      2      6      1
[31]      0      2      2      2      2      3      5      4      0      1
[41]      5      8      6      4     10      3      7      7      4      3
[51]      7      6     16     11     15     15     16     25     20     22
[61]     31     42     48     62     57     45     69     70     98    104
[71]     79    155    214    277    389    333    626    937   1629   3471
[81] 175786

我相信我想使用$breaks作为我的x轴,$counts作为我的y轴。


对于基于ggplot2的解决方案,请查看https://dev59.com/t2w05IYBdhLWcg3wgyHI - Paul Hiemstra
1
@PaulHiemstra,谢谢但正如我所说,我并不打算制作表格,因为我不介意图表有多么具有误导性(会提供充分说明),不幸的是,那里的答案只提到我_可能_能够使用plotrix和axis.break,而我已经在研究这个问题。 - Kyle Oliveira
你有没有想出如何做到这一点?看起来这个问题还没有得到解答,我在想是否需要重新提问,因为我也有同样的问题。 - user1521655
2个回答

12

您可以使用 plotrix 包中的 gap.barplot

# install.packages('plotrix', dependencies = TRUE)
require(plotrix)

   example(gap.barplot)
或者
twogrp<-c(rnorm(10)+4,rnorm(10)+20)
gap.barplot(twogrp,gap=c(8,16),xlab="Index",ytics=c(3,6,17,20),
ylab="Group values",main="Barplot with gap")

运行以下代码会产生这个图像, example(gap.barplot)

更新于 2012-05-09 19:15:42 PDT

使用 facet_wrap"free"(或 "free_y"scales 是否是一个选择?这样你就能够将数据并排比较,但是有不同的 y 轴刻度。

以下是我的简单示例,

library('ggplot2')

source("http://www.ling.upenn.edu/~joseff/rstudy/data/coins.R")
coins$foo <- ifelse(coins$Mass.g >= 10,  c("Low"), c("hight")) 
m <- ggplot(coins, aes(x = Mass.g)) 
m + geom_histogram(binwidth = 2) + facet_wrap(~ foo, scales = "free")
上述代码将提供给您此内容, enter image description here

这很有希望,我认为它几乎解答了我的问题。我怎样可以让它像正常的直方图一样绘制频率?从我所看到的,gap.barplot 只是简单地绘制一个高度等于该索引处数值的条形图。与其使用数值,我认为我更想要高度等于该数值频率的条形图。 - Kyle Oliveira
@KyleOliveira,如果您手动将数据转换为频率,然后绘制它,这样会起作用吗?如果您提供一些示例数据,那么演示将更容易。无论如何,我确实喜欢joran在此线程中的答案 - Eric Fail
能否查看上面的更新?这样对您有没有更好的理解?关于编程方面的内容。 - Kyle Oliveira

1
这似乎有效:

gap.barplot(hdata$counts,gap=c(4000,175000),xlab="Counts",ytics=c(0,3500,175000),
    ylab="Frequency",main="Barplot with gap",xtics=hdata$counts)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接