如何在R中一起绘制两个直方图?


Answers

这是一个更简单的解决方案,使用基础图形和alpha混合(不适用于所有图形设备):

set.seed(42)
p1 <- hist(rnorm(500,4))                     # centered at 4
p2 <- hist(rnorm(500,6))                     # centered at 6
plot( p1, col=rgb(0,0,1,1/4), xlim=c(0,10))  # first histogram
plot( p2, col=rgb(1,0,0,1/4), xlim=c(0,10), add=T)  # second

关键是颜色是半透明的。

编辑,超过两年后 :因为这只是一个upvote,我想我可以添加一个视觉代码生成的alpha混合是如此有用:

Question

我使用R,我有两个数据框:胡萝卜和黄瓜。 每个数据框都有一个数字列,列出所有测量的胡萝卜(总数:100k胡萝卜)和黄瓜(总数:50k黄瓜)的长度。

我想绘制两个直方图 - 胡萝卜长度和黄瓜长度 - 在同一个图上。 它们重叠,所以我想我也需要一些透明度。 我还需要使用相对频率而不是绝对数字,因为每个组中的实例数量是不同的。

这样的事情会很好,但我不明白如何从我的两个表创建它:




下面是一个如何在“经典”R图形中实现它的例子:

## generate some random data
carrotLengths <- rnorm(1000,15,5)
cucumberLengths <- rnorm(200,20,7)
## calculate the histograms - don't plot yet
histCarrot <- hist(carrotLengths,plot = FALSE)
histCucumber <- hist(cucumberLengths,plot = FALSE)
## calculate the range of the graph
xlim <- range(histCucumber$breaks,histCarrot$breaks)
ylim <- range(0,histCucumber$density,
              histCarrot$density)
## plot the first graph
plot(histCarrot,xlim = xlim, ylim = ylim,
     col = rgb(1,0,0,0.4),xlab = 'Lengths',
     freq = FALSE, ## relative, not absolute frequency
     main = 'Distribution of carrots and cucumbers')
## plot the second graph on top of this
opar <- par(new = FALSE)
plot(histCucumber,xlim = xlim, ylim = ylim,
     xaxt = 'n', yaxt = 'n', ## don't add axes
     col = rgb(0,0,1,0.4), add = TRUE,
     freq = FALSE) ## relative, not absolute frequency
## add a legend in the corner
legend('topleft',c('Carrots','Cucumbers'),
       fill = rgb(1:0,0,0:1,0.4), bty = 'n',
       border = NA)
par(opar)

唯一的问题是,如果直方图中断是对齐的,它看起来好多了,这可能需要手动完成(在传递给hist的参数中)。




Plotly的R API可能对你有用。 下面的图表在here

library(plotly)
#add username and key
p <- plotly(username="Username", key="API_KEY")
#generate data
x0 = rnorm(500)
x1 = rnorm(500)+1
#arrange your graph
data0 = list(x=x0,
         name = "Carrots",
         type='histogramx',
         opacity = 0.8)

data1 = list(x=x1,
         name = "Cukes",
         type='histogramx',
         opacity = 0.8)
#specify type as 'overlay'
layout <- list(barmode='overlay',
               plot_bgcolor = 'rgba(249,249,251,.85)')  
#format response, and use 'browseURL' to open graph tab in your browser.
response = p$plotly(data0, data1, kwargs=list(layout=layout))

url = response$url
filename = response$filename

browseURL(response$url)

充分披露:我在球队中。




这里的版本就像ggplot2版本,我只在R基础版中给出了。我从@nullglob中复制了一些版本。

生成数据

carrots <- rnorm(100000,5,2)
cukes <- rnorm(50000,7,2.5)

您不需要像使用ggplot2那样将其放入数据框中。 这种方法的缺点是你必须写出更多的情节细节。 好处是你可以控制剧情的更多细节。

## calculate the density - don't plot yet
densCarrot <- density(carrots)
densCuke <- density(cukes)
## calculate the range of the graph
xlim <- range(densCuke$x,densCarrot$x)
ylim <- range(0,densCuke$y, densCarrot$y)
#pick the colours
carrotCol <- rgb(1,0,0,0.2)
cukeCol <- rgb(0,0,1,0.2)
## plot the carrots and set up most of the plot parameters
plot(densCarrot, xlim = xlim, ylim = ylim, xlab = 'Lengths',
     main = 'Distribution of carrots and cucumbers', 
     panel.first = grid())
#put our density plots in
polygon(densCarrot, density = -1, col = carrotCol)
polygon(densCuke, density = -1, col = cukeCol)
## add a legend in the corner
legend('topleft',c('Carrots','Cucumbers'),
       fill = c(carrotCol, cukeCol), bty = 'n',
       border = NA)




Related