以下代码
library(ggplot2)
library(reshape2)
m=melt(iris[,1:4])
ggplot(m, aes(value)) +
facet_wrap(~variable,ncol=2,scales="free_x") +
geom_histogram()
生成4个固定y轴的图形(这就是我想要的)。但是,默认情况下,y轴仅显示在刻面图的左侧(即第1和第3图的一侧)。
如何让y轴在所有4个图表上显示?谢谢!
编辑:根据@Roland的建议,可以设置scales="free"
并使用ylim(c(0,30))
,但我不希望每次都手动设置限制。
@Roland还建议在ggplot之外使用hist
和ddply
来获取最大数量。是否有基于ggplot2
的解决方案?
编辑: @babptiste有一个非常优雅的解决方案。但是,当更改binwidth时,它开始表现得很奇怪(至少对我而言)。使用默认binwidth(范围/ 30)检查此示例。 y轴上的值介于0到30,000之间。
library(ggplot2)
library(reshape2)
m=melt(data=diamonds[,c("x","y","z")])
ggplot(m,aes(x=value)) +
facet_wrap(~variable,ncol=2,scales="free") +
geom_histogram() +
geom_blank(aes(y=max(..count..)), stat="bin")
现在就是这个。
ggplot(m,aes(x=value)) +
facet_wrap(~variable,scales="free") +
geom_histogram(binwidth=0.5) +
geom_blank(aes(y=max(..count..)), stat="bin")
现在将binwidth设置为0.5,因此最高频率应该改变(事实上减少,因为在更紧密的箱中会有更少的观测值)。但是,y轴没有发生任何变化,它仍然覆盖了相同数量的值,在每个图形中创建了一个巨大的空白区域。
[问题解决了......请参阅@ baptiste编辑的答案。]
答案 0 :(得分:6)
这就是你要追求的吗?
ggplot(m, aes(value)) +
facet_wrap(~variable,scales="free") +
geom_histogram(binwidth=0.5) +
geom_blank(aes(y=max(..count..)), stat="bin", binwidth=0.5)
答案 1 :(得分:3)
ggplot(m, aes(value)) +
facet_wrap(~variable,scales="free") +
ylim(c(0,30)) +
geom_histogram()
答案 2 :(得分:0)
{{}}}中的Didzis Elferts建议使用ggplot_build()
获取geom_histogram中使用的bin的值(ggplot_build()
提供ggplot2
用于绘制图表的数据)。将图表存储在对象中后,您可以在count
列中找到所有分档的值:
library(ggplot2)
library(reshape2)
m=melt(iris[,1:4])
plot = ggplot(m) +
facet_wrap(~variable,scales="free") +
geom_histogram(aes(x=value))
ggplot_build(plot)$data[[1]]$count
因此,我试图用这个替换max y limit:
max(ggplot_build(plot)$data[[1]]$count)
并设法得到一个有效的例子:
m=melt(data=diamonds[,c("x","y","z")])
bin=0.5 # you can use this to try out different bin widths to see the results
plot=
ggplot(m) +
facet_wrap(~variable,scales="free") +
geom_histogram(aes(x=value),binwidth=bin)
ggplot(m) +
facet_wrap(~variable,ncol=2,scales="free") +
geom_histogram(aes(x=value),binwidth=bin) +
ylim(c(0,max(ggplot_build(plot)$data[[1]]$count)))
它完成了这项工作,尽管是笨拙的。如果有人对此进行了改进以消除创建2个图形的需要,或者更确切地说是相同的图形两次,那将是很好的。