如何在R中的ggplot2中绘制堆积点直方图?

时间:2013-04-25 13:38:52

标签: r plot ggplot2

ggplot2相当于“dotplot”直方图是什么?使用堆积点而不是条形图?与R中的此解决方案类似:

Plot Histogram with Points Instead of Bars

是否可以在ggplot2中执行此操作?理想情况下,显示为堆栈的点和显示平滑线“适合”这些点的微弱线(这将形成直方图形状。)

4 个答案:

答案 0 :(得分:6)

是的,ggplot2执行点图(顺便说一下,它可能会显示您可以想象的所有图表,请查看http://docs.ggplot2.org/current/index.html)。基本上,你想要的是这个:

require(ggplot2)
set.seed(789)
x <- data.frame(y = sample(1:20, 100, replace = TRUE))
ggplot(x, aes(y)) + geom_dotplot()

为了使其表现得像一个简单的点图,我们应该这样做:

ggplot(x, aes(y)) + geom_dotplot(binwidth=1, method='histodot')    

你应该得到这个:

first plot

要解决密度问题,您必须添加另一个字词ylim(),以便您的绘图调用的格式为ggplot() + geom_dotplot() + ylim()

更具体地说,您将编写ylim(0, A),其中A将是计算1.00密度所需的堆叠点数。在上面的示例中,您可以做的最好是看到7.5点达到0.50密度标记。从那里,你可以推断15点将达到1.00。

所以你的新电话看起来像这样:

ggplot(x, aes(y)) + geom_dotplot(binwidth=1, method='histodot') + ylim(0, 15)

哪个会给你这个:

second plot

通常,这种眼球估计适用于点图,但当然您可以尝试其他值来微调您的尺度。

请注意,更改ylim值不会影响数据的显示方式,只是更改y轴上的标签。

答案 1 :(得分:5)

正如@joran所指出的,你可以使用geom_dotplot

require(ggplot2)
ggplot(mtcars, aes(x = mpg)) + geom_dotplot()

enter image description here

答案 2 :(得分:1)

我使用@Waldir Leoncio的后一种方法介绍了一种精确的方法。

library(ggplot2); library(grid)

set.seed(789)
x <- data.frame(y = sample(1:20, 100, replace = TRUE))

g <- ggplot(x, aes(y)) + geom_dotplot(binwidth=0.8)
g  # output to read parameter

### calculation of width and height of panel
grid.ls(view=TRUE, grob=FALSE)
real_width <- convertWidth(unit(1,'npc'), 'inch', TRUE)
real_height <- convertHeight(unit(1,'npc'), 'inch', TRUE)

### calculation of other values
width_coordinate_range <- diff(ggplot_build(g)$panel$ranges[[1]]$x.range)
real_binwidth <- real_width / width_coordinate_range * 0.8  # 0.8 is the argument binwidth
num_balls <- real_height / 1.1 / real_binwidth  # the number of stacked balls. 1.1 is expanding value.
   # num_balls is the value of A

g + ylim(0, num_balls)

enter image description here

答案 3 :(得分:1)

道歉:我没有足够的声誉来发表评论。

我喜欢cuttlefish44的“精确方法”,但为了使其工作(使用ggplot2 [2.2.1])我不得不改变以下行:

### calculation of other values
width_coordinate_range <- diff(ggplot_build(g)$panel$ranges[[1]]$x.range)

### calculation of other values
width_coordinate_range <- diff(ggplot_build(g)$layout$panel_ranges[[1]]$x.range)