簡體   English   中英

疊加密度圖不包括直方圖值

[英]Overlay density plot excludes histogram values

我想將密度曲線疊加到我構造的頻率直方圖上。 對於頻率直方圖,我使用了aes(y=..counts../40)因為40是我的總樣本數。 我使用aes(y=..density..*0.1)來強制密度介於0和1之間,因為我的binwidth是0.1。 但是,密度曲線不適合我的數據,它排除了等於1.0的值(注意直方圖顯示bin =(1.0,1.1)的累積值,但密度曲線結束於1.0)

這是我的數據

data<-structure(list(variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("E1", "test"
), class = "factor"), value = c(0.288888888888889, 0.0817901234567901, 
0.219026548672566, 0.584795321637427, 0.927554980595084, 0.44661095636026, 
1, 0.653780942692438, 1, 0.806451612903226, 1, 0.276794335371741, 
1, 0.930109557990178, 0.776864728192162, 0.824909747292419, 1, 
1, 1, 1, 1, 0.0875912408759124, 0.308065494238933, 1, 0.0258064516129032, 
0.0167322834645669, 1, 1, 0.355605889014723, 0.310344827586207, 
0.106598984771574, 0.364447494852436, 0.174724342663274, 0.77491961414791, 
1, 0.856026785714286, 0.680759275237274, 0.850657108721625, 1, 
1, 0, 0.851851851851852, 1, 0, 0.294954721862872, 0.819870009285051, 
0, 0.734147168531706, 0.0135424091233072, 0.0189098998887653, 
0.0101010101010101, 0, 0.296905222437137, 0.706837929731772, 
0.269279393173198, 0.135379061371841, 0.158969804618117, 0.0902981940361193, 
0.00423131170662906, 0, 0.374880611270296, 0.0425790754257908, 
0.145542753183748, 0, 0.129032258064516, 0.260334645669291, 0, 
0, 1, 0.175505350772889, 0.08248730964467, 0, 0.317217981340119, 
0.614147909967846, 0, 0.264508928571429, 0.883520276100086, 0.0657108721624851, 
0, 0.560229445506692)), row.names = c(NA, -80L), .Names = c("variable", 
"value"), class = "data.frame")

情節

q<-ggplot(data, aes(value, fill = variable)) 
        q + geom_density(alpha = 0.6,aes(y=..density..*0.1),binwidth=0.1) 
    + theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) 
    + theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) 
    + labs(title="Density Plot GrupoB",x="Respuesta",y="Density")
    +scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1))
    +geom_histogram(alpha = 0.6,aes(y=..count../40),binwidth=0.1,position="dodge")

我得到的輸出就是這個 在此輸入圖像描述

您的情節正在完成您的數據預期:

  • 您繪制data$value ,其中包含0到1之間的數值,因此您應該期望密度曲線也從0到1運行。
  • 您繪制了帶寬為0.1的直方圖。 箱櫃在下部封閉,在上端開口。 因此,在您的情況下得到的分箱是[0,0.1),[0.1,0.2),......,[0.9,1.0),[1.0,1.1]。 數據中有17個值為1,因此進入最后一個bin,從1到1.1繪制。

我認為以你的方式繪制直方圖是個壞主意。 原因是對於直方圖,x軸是連續的,這意味着覆蓋x軸的條形范圍從例如0.1到0.2表示在0.1和0.2之間(包括)0.1和0.2之間的值的計數(不包括后者)。 在這種情況下使用閃避會導致圖像失真,因為條形圖現在不再覆蓋正確的x軸范圍。 兩個條形共享應該由它們全部覆蓋的范圍。 這種失真是密度曲線似乎與直方圖不匹配的原因之一。

所以你能對它做點啥? 我可以給你一些建議,但也許其他人有更好的想法......

  • 您可以使用分面,即將直方圖(和相應的密度曲線)繪制成單獨的圖,而不是使用position="dodge"將直方圖繪制在彼此旁邊。 這可以通過在你的圖中添加+ facet_grid(variable~.)來實現。

  • 你可以欺騙一點,讓最后一個箱子,[0.9,1),包括1(即它是[0.9,1.0])。 只需將數據中的1替換為0.999,如下所示: data$value[data$value==1]<-0.999 重要的是,您對繪圖執行此操作,它實際上只意味着您稍微重新定義了分箱。 對於您縮進的所有數值評估,您不應該進行此替換! (例如,它將改變data$value的平均值。)

  • 關於密度曲線和直方圖的標准化:密度曲線不需要介於0和1之間。限制是密度曲線上的積分應為1.因此,要使密度曲線和直方圖比較,此外,直方圖應該具有積分1,這也是通過將y值除以綁定寬度來實現的。 所以,你應該使用geom_density(alpha = 0.6,aes(y=..density..)) (我也刪除了bindwith=0.1因為它對geom_density沒有影響)和geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1) (一旦你使用刻面,就不需要position="dodge" )。 當然,這導致了你所具有的相對歸一化,但它更有意義,因為密度曲線和直方圖上的積分是1,正如它們應該的那樣。

  • 密度曲線仍然不完全匹配直方圖,這與計算密度估算器的方式有關。 我不詳細地知道這一點,因此遺憾的是不能進一步解釋。 但是通過使用參數adjust to geom_density可以更好地理解它的工作原理。 對於較小的數字,它會使曲線不太平滑,曲線將更接近於直方圖。

為了將所有內容組合在一起,我已將所有建議構建到您的代碼中,在geom_density使用adjust=0.2並繪制結果:

data$value[data$value==1]<-0.999
q<-ggplot(data, aes(value, fill = variable)) 
q + geom_density(alpha = 0.6,aes(y=..density..),adjust=0.2)  +
   theme_minimal()+scale_fill_manual(values =c("#D7191C","#2B83BA")) +
   theme(legend.position="bottom")+ guides(fill=guide_legend(nrow=1)) +
   labs(title="Density Plot GrupoB",x="Respuesta",y="Density")+
   scale_x_continuous(breaks=seq(from=0,to=1.2,by=0.1))+
   geom_histogram(alpha = 0.6,aes(y=..count../40/.1),binwidth=0.1) +
   facet_grid(variable~.)

在此輸入圖像描述

不幸的是,我不能給你一個更完整的答案,但我希望這些想法能給你一個良好的開端。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM