我有一个简短的R脚本,使用ggplot2绘制一些直方图。如何根据直方图中的最大频率(加10%)自动设置直方图中的ymax限制,即
scale_y_continuous(limits= c(0,ymax*1.1)
plot = ggplot(data, aes(myo_activity)) +
geom_histogram(binwidth=0.5, aes(fill=..count..))
plot + scale_x_continuous(expand = c(0,0), limits = c(30,90)) +
scale_y_continuous(expand = c(0,0), limits = c(0,140))
答案 0 :(得分:22)
例如,未提供使用数据movies
作为样本数据。
使用函数ggplot_build()
,您可以获得包含用于绘制数据的所有元素的列表。所有数据都在列表元素data[[1]]
中。此元素的列count
包含直方图的值。您可以使用此列的最大值来设置绘图的限制。
plot = ggplot(movies, aes(rating)) + geom_histogram(binwidth=0.5, aes(fill=..count..))
ggplot_build(plot)$data[[1]]
fill y count x ndensity ncount density PANEL group ymin ymax xmin xmax
1 #132B43 0 0 0.75 0.0000000000 0.0000000000 0.0000000000 1 1 0 0 0.5 1.0
2 #142E48 272 272 1.25 0.0323232323 0.0323232323 0.0092535892 1 1 0 272 1.0 1.5
3 #16314B 454 454 1.75 0.0539512775 0.0539512775 0.0154453290 1 1 0 454 1.5 2.0
4 #17344F 668 668 2.25 0.0793820559 0.0793820559 0.0227257263 1 1 0 668 2.0 2.5
5 #1B3A58 1133 1133 2.75 0.1346405229 0.1346405229 0.0385452813 1 1 0 1133 2.5 3.0
plot + scale_y_continuous(expand = c(0,0),
limits=c(0,max(ggplot_build(plot)$data[[1]]$count)*1.1))
答案 1 :(得分:1)
就个人而言,我发现'hist'函数对于这些类型的计算最有用。 'hist'功能非常快,可以提供您的频率计数。对于您的情况,您可以这样做:
max(hist(data$myo_activity, breaks=seq(range_Min, range_Max, by=bin_Width), plot=FALSE)$counts)
其中range_Min
是理论范围的底部(即0),range_Max
是理论范围之上的上限。 bin_Width
是每个频率计数的值宽度。
等式应该为您提供指定绘图范围所需的最大值。我相信'ggplot'函数无论如何都在调用'hist'函数,所以当我只想要数据时,我更喜欢直接调用它。