Load the required library(s):
> library(ggplot2)
Data
> set.seed(42)
> df <- data.frame(vals = round(c(rnorm(30, mean = 18, sd = 10))))
> head(df)
vals
1 32
2 12
3 22
4 24
5 22
6 17
Density Plot
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Default (Gaussian)", x = "Values", y = "Density") +
+ theme_minimal()

Kimberly Fessel has explained with a visually understandable
tutorial. See here: https://youtu.be/DCgPRaIDYXA
> # Generate 6 random data points from a normal distribution
> set.seed(45) # Setting seed for reproducibility
> data_points <- rnorm(6, mean = 50, sd = 10)
>
> # Bandwidth estimation (Silverman's rule of thumb)
> bandwidth <- 1.06 * sd(data_points) * length(data_points)^(-1/5)
>
> # sequence of x values for plotting the individual Gaussian curves
> x_values <- seq(min(data_points) - 3 * bandwidth, max(data_points) + 3 * bandwidth, length.out = 400)
>
> # Function to create a data frame for scaled individual Gaussian distributions
> gaussian_curve <- function(x, mu) {
+ data.frame(x = x, y = dnorm(x, mean = mu, sd = bandwidth) / length(data_points))
+ }
>
> # Create a list of data frames for each data point
> curves_list <- lapply(data_points, gaussian_curve, x = x_values)
> curves_df <- do.call(rbind, curves_list)
> curves_df$group <- rep(data_points, each = 400)
>
> data_frame <- data.frame(x = data_points)
>
> ggplot() +
+ geom_density(data = data_frame, aes(x = x, y = after_stat(density)), fill = "blue", alpha = 0.4) +
+ geom_line(data = curves_df, aes(x = x, y = y, group = group, col = as.factor(group))) +
+ geom_point(data = data_frame, aes(x = x, y = 0, col = as.factor(x)), size = 3) +
+ labs(title = "Kernal Density Estimation, and Individual Curves",
+ caption = "Kernal used: Gaussian",
+ x = "Data Values",
+ y = "Density") +
+ theme_minimal() +
+ guides(color = "none")

Different Kernal Estimation
Techniques
Different Kernal Estimation Techniques
Refer to this link to know more: https://rdrr.io/r/stats/density.html
More reading materials: 1. Becker, R. A., Chambers, J. M. and Wilks,
A. R. (1988). The New S Language. Wadsworth & Brooks/Cole (for S
version).
Scott, D. W. (1992). Multivariate Density Estimation. Theory,
Practice and Visualization. New York: Wiley.
Sheather, S. J. and Jones, M. C. (1991). A reliable data-based
bandwidth selection method for kernel density estimation. Journal of the
Royal Statistical Society series B, 53, 683–690. . https://www.jstor.org/stable/2345597.
Silverman, B. W. (1986). Density Estimation. London: Chapman and
Hall.
Venables, W. N. and Ripley, B. D. (2002). Modern Applied
Statistics with S. New York: Springer.
Gaussian Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "gaussian", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Gaussian", x = "Values", y = "Density") +
+ theme_minimal()

Epanechnikov Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "epanechnikov", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Epanechnikov", x = "Values", y = "Density") +
+ theme_minimal()

Rectangular Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "rectangular", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Rectangular", x = "Values", y = "Density") +
+ theme_minimal()

Triangular Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "triangular", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Triangular", x = "Values", y = "Density") +
+ theme_minimal()

Biweight Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "biweight", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Biweight", x = "Values", y = "Density") +
+ theme_minimal()

Cosine Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "cosine", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Cosine", x = "Values", y = "Density") +
+ theme_minimal()

Optcosine Kernal
> ggplot(df, aes(x = vals)) +
+ geom_density(alpha = 0.5, kernel = "optcosine", fill = "lightgreen") +
+ labs(title = "Density Plot",
+ subtitle = "Kernal: Optcosine", x = "Values", y = "Density") +
+ theme_minimal()

Histogram and Density Plot Combined
> # Create the combined histogram and density plot
> ggplot(df, aes(x = vals)) +
+ geom_histogram(aes(y = after_stat(density)), bins = 30, fill = "lightblue", color = "black") +
+ geom_density(alpha = 0.5, fill = "lightgreen") +
+ labs(title = "Combined Histogram and Density Plot", x = "Value", y = "Density") +
+ theme_minimal()

LS0tDQp0aXRsZTogRGVuc2l0eSBQbG90IGFuZCBIaXN0b2dyYW0NCmF1dGhvcjogJ01EIEFIU0FOVUwgSVNMQU0nDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIHRvY19kZXB0aDogNA0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCi0tLQ0KYGBge3IsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoDQogIGNvbW1lbnQgPSAiIiwgcHJvbXB0ID0gVFJVRSwgbWVzc2FnZT1GLCB3YXJuaW5nPUYNCikNCmBgYA0KDQotLS0NCg0KTG9hZCB0aGUgcmVxdWlyZWQgbGlicmFyeShzKToNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KLS0tDQoNCiMgRGF0YQ0KDQpgYGB7cn0NCnNldC5zZWVkKDQyKQ0KZGYgPC0gZGF0YS5mcmFtZSh2YWxzID0gcm91bmQoYyhybm9ybSgzMCwgbWVhbiA9IDE4LCBzZCA9IDEwKSkpKQ0KaGVhZChkZikNCmBgYA0KDQotLS0NCg0KIyBEZW5zaXR5IFBsb3QNCg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdmFscykpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41LCBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBQbG90IiwgDQogICAgICAgc3VidGl0bGUgPSAiS2VybmFsOiBEZWZhdWx0IChHYXVzc2lhbikiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KS2ltYmVybHkgRmVzc2VsIGhhcyBleHBsYWluZWQgd2l0aCBhIHZpc3VhbGx5IHVuZGVyc3RhbmRhYmxlIHR1dG9yaWFsLiBTZWUgaGVyZTogW2h0dHBzOi8veW91dHUuYmUvRENnUFJhSURZWEFdKGh0dHBzOi8veW91dHUuYmUvRENnUFJhSURZWEEpDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICdmb2xkLWhpZGUnfQ0KIyBHZW5lcmF0ZSA2IHJhbmRvbSBkYXRhIHBvaW50cyBmcm9tIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbg0Kc2V0LnNlZWQoNDUpICMgU2V0dGluZyBzZWVkIGZvciByZXByb2R1Y2liaWxpdHkNCmRhdGFfcG9pbnRzIDwtIHJub3JtKDYsIG1lYW4gPSA1MCwgc2QgPSAxMCkNCg0KIyBCYW5kd2lkdGggZXN0aW1hdGlvbiAoU2lsdmVybWFuJ3MgcnVsZSBvZiB0aHVtYikNCmJhbmR3aWR0aCA8LSAxLjA2ICogc2QoZGF0YV9wb2ludHMpICogbGVuZ3RoKGRhdGFfcG9pbnRzKV4oLTEvNSkNCg0KIyBzZXF1ZW5jZSBvZiB4IHZhbHVlcyBmb3IgcGxvdHRpbmcgdGhlIGluZGl2aWR1YWwgR2F1c3NpYW4gY3VydmVzDQp4X3ZhbHVlcyA8LSBzZXEobWluKGRhdGFfcG9pbnRzKSAtIDMgKiBiYW5kd2lkdGgsIG1heChkYXRhX3BvaW50cykgKyAzICogYmFuZHdpZHRoLCBsZW5ndGgub3V0ID0gNDAwKQ0KDQojIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGRhdGEgZnJhbWUgZm9yIHNjYWxlZCBpbmRpdmlkdWFsIEdhdXNzaWFuIGRpc3RyaWJ1dGlvbnMNCmdhdXNzaWFuX2N1cnZlIDwtIGZ1bmN0aW9uKHgsIG11KSB7DQogIGRhdGEuZnJhbWUoeCA9IHgsIHkgPSBkbm9ybSh4LCBtZWFuID0gbXUsIHNkID0gYmFuZHdpZHRoKSAvIGxlbmd0aChkYXRhX3BvaW50cykpDQp9DQoNCiMgQ3JlYXRlIGEgbGlzdCBvZiBkYXRhIGZyYW1lcyBmb3IgZWFjaCBkYXRhIHBvaW50DQpjdXJ2ZXNfbGlzdCA8LSBsYXBwbHkoZGF0YV9wb2ludHMsIGdhdXNzaWFuX2N1cnZlLCB4ID0geF92YWx1ZXMpDQpjdXJ2ZXNfZGYgPC0gZG8uY2FsbChyYmluZCwgY3VydmVzX2xpc3QpDQpjdXJ2ZXNfZGYkZ3JvdXAgPC0gcmVwKGRhdGFfcG9pbnRzLCBlYWNoID0gNDAwKQ0KDQpkYXRhX2ZyYW1lIDwtIGRhdGEuZnJhbWUoeCA9IGRhdGFfcG9pbnRzKQ0KDQpnZ3Bsb3QoKSArDQogIGdlb21fZGVuc2l0eShkYXRhID0gZGF0YV9mcmFtZSwgYWVzKHggPSB4LCB5ID0gYWZ0ZXJfc3RhdChkZW5zaXR5KSksIGZpbGwgPSAiYmx1ZSIsIGFscGhhID0gMC40KSArDQogIGdlb21fbGluZShkYXRhID0gY3VydmVzX2RmLCBhZXMoeCA9IHgsIHkgPSB5LCBncm91cCA9IGdyb3VwLCBjb2wgPSBhcy5mYWN0b3IoZ3JvdXApKSkgKw0KICBnZW9tX3BvaW50KGRhdGEgPSBkYXRhX2ZyYW1lLCBhZXMoeCA9IHgsIHkgPSAwLCBjb2wgPSBhcy5mYWN0b3IoeCkpLCBzaXplID0gMykgKw0KICBsYWJzKHRpdGxlID0gIktlcm5hbCBEZW5zaXR5IEVzdGltYXRpb24sIGFuZCBJbmRpdmlkdWFsIEN1cnZlcyIsDQogICAgICAgY2FwdGlvbiA9ICJLZXJuYWwgdXNlZDogR2F1c3NpYW4iLA0KICAgICAgIHggPSAiRGF0YSBWYWx1ZXMiLCANCiAgICAgICB5ID0gIkRlbnNpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGd1aWRlcyhjb2xvciA9ICJub25lIikNCmBgYA0KDQoNCi0tLQ0KDQojIERpZmZlcmVudCBLZXJuYWwgRXN0aW1hdGlvbiBUZWNobmlxdWVzIHsudGFic2V0IC50YWJzZXQtZmFkZSAudGFic2V0LXBpbGxzfQ0KDQoNCg0KIVtEaWZmZXJlbnQgS2VybmFsIEVzdGltYXRpb24gVGVjaG5pcXVlc10oaHR0cHM6Ly91cGxvYWQud2lraW1lZGlhLm9yZy93aWtpcGVkaWEvY29tbW9ucy90aHVtYi80LzQ3L0tlcm5lbHMuc3ZnLzEyODBweC1LZXJuZWxzLnBuZykNCg0KDQoNClJlZmVyIHRvIHRoaXMgbGluayB0byBrbm93IG1vcmU6IGh0dHBzOi8vcmRyci5pby9yL3N0YXRzL2RlbnNpdHkuaHRtbA0KDQpNb3JlIHJlYWRpbmcgbWF0ZXJpYWxzOiANCjEuIEJlY2tlciwgUi4gQS4sIENoYW1iZXJzLCBKLiBNLiBhbmQgV2lsa3MsIEEuIFIuICgxOTg4KS4gVGhlIE5ldyBTIExhbmd1YWdlLiBXYWRzd29ydGggJiBCcm9va3MvQ29sZSAoZm9yIFMgdmVyc2lvbikuDQoNCjIuIFNjb3R0LCBELiBXLiAoMTk5MikuIE11bHRpdmFyaWF0ZSBEZW5zaXR5IEVzdGltYXRpb24uIFRoZW9yeSwgUHJhY3RpY2UgYW5kIFZpc3VhbGl6YXRpb24uIE5ldyBZb3JrOiBXaWxleS4NCg0KMy4gU2hlYXRoZXIsIFMuIEouIGFuZCBKb25lcywgTS4gQy4gKDE5OTEpLiBBIHJlbGlhYmxlIGRhdGEtYmFzZWQgYmFuZHdpZHRoIHNlbGVjdGlvbiBtZXRob2QgZm9yIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24uIEpvdXJuYWwgb2YgdGhlIFJveWFsIFN0YXRpc3RpY2FsIFNvY2lldHkgc2VyaWVzIEIsIDUzLCA2ODPigJM2OTAuIFxTZXhwcltyZXN1bHRzPXJkLHN0YWdlPWJ1aWxkXXt0b29sczo6OlJkX2V4cHJfZG9pKCIxMC4xMTExL2ouMjUxNy02MTYxLjE5OTEudGIwMTg1Ny54Iil9LiBodHRwczovL3d3dy5qc3Rvci5vcmcvc3RhYmxlLzIzNDU1OTcuDQoNCjQuIFNpbHZlcm1hbiwgQi4gVy4gKDE5ODYpLiBEZW5zaXR5IEVzdGltYXRpb24uIExvbmRvbjogQ2hhcG1hbiBhbmQgSGFsbC4NCg0KNS4gVmVuYWJsZXMsIFcuIE4uIGFuZCBSaXBsZXksIEIuIEQuICgyMDAyKS4gTW9kZXJuIEFwcGxpZWQgU3RhdGlzdGljcyB3aXRoIFMuIE5ldyBZb3JrOiBTcHJpbmdlci4NCg0KIyMgR2F1c3NpYW4gS2VybmFsDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHZhbHMpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwga2VybmVsID0gImdhdXNzaWFuIiwgZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCIsIA0KICAgICAgIHN1YnRpdGxlID0gIktlcm5hbDogR2F1c3NpYW4iLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgRXBhbmVjaG5pa292IEtlcm5hbA0KDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSB2YWxzKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGtlcm5lbCA9ICJlcGFuZWNobmlrb3YiLCBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBQbG90IiwgDQogICAgICAgc3VidGl0bGUgPSAiS2VybmFsOiBFcGFuZWNobmlrb3YiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgUmVjdGFuZ3VsYXIgS2VybmFsDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHZhbHMpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwga2VybmVsID0gInJlY3Rhbmd1bGFyIiwgZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCIsIA0KICAgICAgIHN1YnRpdGxlID0gIktlcm5hbDogUmVjdGFuZ3VsYXIiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgVHJpYW5ndWxhciBLZXJuYWwNCg0KYGBge3J9DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdmFscykpICsNCiAgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC41LCBrZXJuZWwgPSAidHJpYW5ndWxhciIsIGZpbGwgPSAibGlnaHRncmVlbiIpICsNCiAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IFBsb3QiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJLZXJuYWw6IFRyaWFuZ3VsYXIiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgQml3ZWlnaHQgS2VybmFsDQoNCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IHZhbHMpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSwga2VybmVsID0gImJpd2VpZ2h0IiwgZmlsbCA9ICJsaWdodGdyZWVuIikgKw0KICBsYWJzKHRpdGxlID0gIkRlbnNpdHkgUGxvdCIsIA0KICAgICAgIHN1YnRpdGxlID0gIktlcm5hbDogQml3ZWlnaHQiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgQ29zaW5lIEtlcm5hbA0KDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSB2YWxzKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGtlcm5lbCA9ICJjb3NpbmUiLCBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBQbG90IiwgDQogICAgICAgc3VidGl0bGUgPSAiS2VybmFsOiBDb3NpbmUiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyMgT3B0Y29zaW5lIEtlcm5hbA0KDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSB2YWxzKSkgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGtlcm5lbCA9ICJvcHRjb3NpbmUiLCBmaWxsID0gImxpZ2h0Z3JlZW4iKSArDQogIGxhYnModGl0bGUgPSAiRGVuc2l0eSBQbG90IiwgDQogICAgICAgc3VidGl0bGUgPSAiS2VybmFsOiBPcHRjb3NpbmUiLCB4ID0gIlZhbHVlcyIsIHkgPSAiRGVuc2l0eSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KIyBIaXN0b2dyYW0gYW5kIERlbnNpdHkgUGxvdCBDb21iaW5lZA0KDQoNCmBgYHtyfQ0KIyBDcmVhdGUgdGhlIGNvbWJpbmVkIGhpc3RvZ3JhbSBhbmQgZGVuc2l0eSBwbG90DQpnZ3Bsb3QoZGYsIGFlcyh4ID0gdmFscykpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHkgPSBhZnRlcl9zdGF0KGRlbnNpdHkpKSwgYmlucyA9IDMwLCBmaWxsID0gImxpZ2h0Ymx1ZSIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX2RlbnNpdHkoYWxwaGEgPSAwLjUsIGZpbGwgPSAibGlnaHRncmVlbiIpICsNCiAgbGFicyh0aXRsZSA9ICJDb21iaW5lZCBIaXN0b2dyYW0gYW5kIERlbnNpdHkgUGxvdCIsIHggPSAiVmFsdWUiLCB5ID0gIkRlbnNpdHkiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQo=