2017-09-07 5 views
1

these dataで6つのヒストグラム(データ(カロリー、ナトリウム)x 3タイプ(ビーフ、肉、家禽)の2列)をプロットしようとしています。 x軸とy軸のスケールは同じです。私はscale_x_continuousを使ってx軸を制限していますが、これはさまざまなソースによれば、プロットに表示されないデータを削除します。ここでggplot2カスタムx軸の制限でヒストグラムをプロットするときのデータがありません

#src.table is the data frame containing my data 
histogram <- function(df, dataset, n_bins, label) { 
    ggplot(df, aes(x=df[[dataset]])) + 
    geom_histogram(color="darkblue", fill="lightblue", bins = n_bins) + xlab(label) 
} 
src2_12.beef <- src2_12.table[src2_12.table$Type == "Beef",] 
src2_12.meat <- src2_12.table[src2_12.table$Type == "Meat",] 
src2_12.poultry <- src2_12.table[src2_12.table$Type == "Poultry",] 

src2_12.calories_scale <- lims(x = c(min(src2_12.table$Calories), max(src2_12.table$Calories)), y = c(0, 6)) 
src2_12.sodium_scale <- lims(x = c(min(src2_12.table$Sodium), max(src2_12.table$Sodium)), y = c(0, 6)) 
#src2_12.calories_scale <- lims() 
#src2_12.sodium_scale <- lims() 

src2_12.plots <- list(
    histogram(src2_12.beef, "Calories", 10, "Calories-Beef") + src2_12.calories_scale, 
    histogram(src2_12.meat, "Calories", 10, "Calories-Meat") + src2_12.calories_scale, 
    histogram(src2_12.poultry, "Calories", 10, "Calories-Poultry") + src2_12.calories_scale, 
    histogram(src2_12.beef, "Sodium", 10, "Sodium-Beef") + src2_12.sodium_scale, 
    histogram(src2_12.meat, "Sodium", 10, "Sodium-Meat") + src2_12.sodium_scale, 
    histogram(src2_12.poultry, "Sodium", 10, "Sodium-Poultry") + src2_12.sodium_scale 
) 
multiplot(plotlist = src2_12.plots, cols = 2, layout = matrix(c(1, 2, 3, 4, 5, 6), nrow = 2, byrow = TRUE)) 

出力されています:ここに私のコードです output

対データが見えるようになっているもの: enter image description here

私はいくつかのデータポイントがある理由を理解できませんでした欠落しているのは、私が設定した限界が既にデータの最小値と最大値であるからです。

答えて

3

おそらくlimsの代わりにcoord_cartesianを使用します。生データから実際のヒストグラムに至るには、かなりの厄介な変換が行われなければならないので、ヒストグラムの限界を抱いているときに予期しないことが起こる可能性があります。 1例えばフードの下

レッツ・ピア:

p <- ggplot(src2_12.beef,aes(x = Calories)) + 
    geom_histogram(bins = 10) 
p1 <- ggplot(src2_12.beef,aes(x = Calories)) + 
    geom_histogram(bins = 10) + 
    lims(x = c(86,195)) 

a <- ggplot_build(p) 
b <- ggplot_build(p1) 

>a$data[[1]][,1:5] 
    y count  x  xmin  xmax 
1 1  1 114.1111 109.7222 118.5000 
2 0  0 122.8889 118.5000 127.2778 
3 3  3 131.6667 127.2778 136.0556 
4 2  2 140.4444 136.0556 144.8333 
5 5  5 149.2222 144.8333 153.6111 
6 2  2 158.0000 153.6111 162.3889 
7 0  0 166.7778 162.3889 171.1667 
8 2  2 175.5556 171.1667 179.9444 
9 3  3 184.3333 179.9444 188.7222 
10 2  2 193.1111 188.7222 197.5000 

> b$data[[1]][,1:5] 
    y count   x  xmin  xmax 
1 0  0  NA  NA 90.83333 
2 0  0 96.88889 90.83333 102.94444 
3 1  1 109.00000 102.94444 115.05556 
4 0  0 121.11111 115.05556 127.16667 
5 4  4 133.22222 127.16667 139.27778 
6 4  4 145.33333 139.27778 151.38889 
7 4  4 157.44444 151.38889 163.50000 
8 1  1 169.55556 163.50000 175.61111 
9 4  4 181.66667 175.61111 187.72222 
10 2  2 193.77778 187.72222  NA 
> 

は、だから今、あなたは一体、右起こるをどうやったのか、迷っていますか?

ggplotに10ビンを指定し、xリミットを86から195にすると、ヒストグラムアルゴリズムはその実際の範囲にまたがる10ビンを作成しようとします。そのため、そこにデータがなくても、100を下回るビンを作成しようとしています。

、バーの幅は、一般的に高いであなたの実際のデータの下の少し上と少しを網羅しますので、バーは、公称データ範囲(xminxmax値)を超えて延長することができるので、その後さらに奇妙に発生することがありますと低い終わり。

coord_cartesianの後にの処理が行われたので、これらの小さな癖をすべてバイパスします。

関連する問題