按类别划分的平均直方图和带置信区间的图

时间:2015-11-03 23:03:42

标签: r ggplot2 histogram visualization

我有一个像这样的数据框df

    x   series  no
1   24  u       3   
2   12  u       2
3   23  v       1
4   17  u       3
5   5   v       2
6   45  v       1
7   18  u       3
8   32  v       2
9   34  u       1
10  37  v       3
...

此处,x是衡量的值,series是测量所属的系列,no是该系列中的数字。

我想了解xseries的价值分布如何在u之间变化。

我可以简单地过滤掉每个系列/否,并将它们绘制成不同的线条。结果如下:

enter image description here

现在你可以看到在v系列中,变化在某些地方更多而在其他地方更少。系列ggplot也是如此。我想以置信区间显示这个,并得到这样的结果:

enter image description here

这里棕色线是线u1,u2和u3的平均值,粉色区域是置信区间。同样适用于浅蓝色,深蓝色和v1,v2,v3。

当然,置信区间看起来会略有不同,因为我在不计算实际CI的情况下不经意地手绘,但希望我的意图很明确。

如何在R中完成此操作?我可以使用 public double[] fourierLowPassFilter(double[] data, double lowPass, double frequency){ //data: input data, must be spaced equally in time. //lowPass: The cutoff frequency at which //frequency: The frequency of the input data. //The apache Fft (Fast Fourier Transform) accepts arrays that are powers of 2. int minPowerOf2 = 1; while(minPowerOf2 < data.length) minPowerOf2 = 2 * minPowerOf2; //pad with zeros double[] padded = new double[minPowerOf2]; for(int i = 0; i < data.length; i++) padded[i] = data[i]; FastFourierTransformer transformer = new FastFourierTransformer(DftNormalization.STANDARD); Complex[] fourierTransform = transformer.transform(padded, TransformType.FORWARD); //build the frequency domain array double[] frequencyDomain = new double[fourierTransform.length]; for(int i = 0; i < frequencyDomain.length; i++) frequencyDomain[i] = frequency * i / (double)fourierTransform.length; //build the classifier array, 2s are kept and 0s do not pass the filter double[] keepPoints = new double[frequencyDomain.length]; keepPoints[0] = 1; for(int i = 1; i < frequencyDomain.length; i++){ if(frequencyDomain[i] < lowPass) keepPoints[i] = 2; else keepPoints[i] = 0; } //filter the fft for(int i = 0; i < fourierTransform.length; i++) fourierTransform[i] = fourierTransform[i].multiply((double)keepPoints[i]); //invert back to time domain Complex[] reverseFourier = transformer.transform(fourierTransform, TransformType.INVERSE); //get the real part of the reverse double[] result = new double[data.length]; for(int i = 0; i< result.length; i++){ result[i] = reverseFourier[i].getReal(); } return result; } 吗?

进行绘图

1 个答案:

答案 0 :(得分:0)

第一张图涉及按两个因素分组,可以使用ggplot2绘制。以下是使用R中的mpg数据集的示例。cty是一个数值变量,drvfl是两个分类变量。

首先必须合并两个因素。

library(dplyr)
copy_mpg <- mpg
copy_mpg <- select(mpg, cty, drv, fl)
copy_mpg$df <- with(copy_mpg, interaction(drv, fl))

简介: ggplot(copy_mpg, aes(hwy, col=df)) + geom_density() + theme_bw()

快捷方式:ggplot(copy_mpg, aes(hwy, col=interaction(drv, fl))) + geom_density() + theme_bw()

Plot 对于第二部分,请按照this SO问题和this统计信息问题进行操作。