carrots <- data.frame(length = rnorm(100000, 6, 2))
cukes <- data.frame(length = rnorm(50000, 7, 2.5))
# Now, combine your two dataframes into one.
# First make a new column in each that will be
# a variable to identify where they came from later.
carrots$veg <- 'carrot'
cukes$veg <- 'cuke'
# and combine into your new data frame vegLengths
vegLengths <- rbind(carrots, cukes)
之后,如果数据已经是长格式,则不需要这样做,您只需要一行就可以绘图。
ggplot(vegLengths, aes(length, fill = veg)) + geom_density(alpha = 0.2)
## 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)
## 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)
# Install the plotteR package
install.packages("devtools")
devtools::install_github("JosephCrispell/basicPlotteR")
library(basicPlotteR)
# Set the seed
set.seed(254534)
# Create random samples from a normal distribution
distributions <- list(rnorm(500, mean=5, sd=0.5),
rnorm(500, mean=8, sd=5),
rnorm(500, mean=20, sd=2))
# Plot overlapping histograms
plotMultipleHistograms(distributions, nBins=20,
colours=c(rgb(1,0,0, 0.5), rgb(0,0,1, 0.5), rgb(0,1,0, 0.5)),
las=1, main="Samples from normal distribution", xlab="Value")
9条答案
按热度按时间irtuqstp1#
下面是一个使用基本图形和alpha混合的更简单的解决方案(它并不适用于所有图形设备):
关键是颜色是半透明的。
编辑,两年多后:由于这刚刚得到了一个赞成票,我想我也可以添加一个可视化的代码产生了什么作为阿尔法混合是如此该死的有用:
wfauudbj2#
你链接到的图像是密度曲线,不是直方图。
如果你一直在阅读ggplot,那么也许你唯一错过的就是把你的两个数据框合并成一个长框。
所以,让我们从你所拥有的东西开始,两组独立的数据,然后把它们结合起来。
之后,如果数据已经是长格式,则不需要这样做,您只需要一行就可以绘图。
现在,如果你真的想要直方图,下面的方法就可以了。注意,你必须改变默认的“stack”参数的位置。如果你不知道你的数据应该是什么样子的,你可能会错过这个。alpha越高看起来越好。还要注意,我把它做成了密度直方图。很容易去掉
y = ..density..
,让它回到计数。另外,我对Dirk的问题进行了评论,所有的参数都可以简单地放在
hist
命令中。我被问到如何做到这一点。下面的内容正好产生了Dirk的图。toe950273#
我写了一个函数uses pseudo-transparency to represent overlapping histograms
这里是another way to do it using R's support for transparent colors
结果最终看起来像这样:
xkftehaa4#
已经有漂亮的答案了,但我想加上这个。看起来不错。(从@Dirk复制的随机数)。需要
library(scales)
。结果是...
我觉得
hist0
的结果比hist
好看的结果
是
wj8zmpe15#
下面是如何在“经典”R图形中执行此操作的示例:
这样做的唯一问题是,如果直方图中断是对齐的,看起来会更好,这可能必须手动完成(在传递给
hist
的参数中)。bbuxkriu6#
这是一个类似ggplot 2的版本,我只给出了R基。我从@nullglob复制了一些。
生成数据
你不需要像ggplot 2那样把它放到数据框中。这种方法的缺点是你必须写出更多的绘图细节。优点是你可以控制更多的绘图细节。
vh0rcniy7#
@德克·埃德尔布特尔:基本思想很好,但所示的代码还可以改进。[需要很长时间来解释,因此单独回答,不作评论。]
hist()
函数默认情况下会绘制曲线图,所以需要添加plot=FALSE
选项。此外,通过plot(0,0,type="n",...)
调用来建立曲线图区域会更清楚,在其中可以添加轴标签、曲线图标题等。最后,我想提一下,还可以使用阴影来区分两个直方图。以下是代码:下面是结果(由于RStudio:-),有点太宽了):
zfycwa2u8#
Plotly's R API可能对您有用。下图为here。
充分披露:我是队里的。
t1rydlwq9#
这么多很好的答案,但由于我刚刚编写了一个函数('basicPlotteR'包中的
plotMultipleHistograms()
)函数来实现这一点,我想我应该添加另一个答案。此函数的优点是它自动设置适当的X轴和Y轴限制,并定义一组在所有分布中使用的公共条柱。
下面是如何使用它:
plotMultipleHistograms()
函数可以采用任意数量的分布,并且所有通用绘图参数都应使用它(例如:las
、main
等)。