Data-Visualization

如何將百分比與條目數進行比較。

  • January 4, 2015

我試圖找出可視化下圖的最佳方法,並強調與嘗試治療的患者人數相比的治療效果。這是實際頁面的鏈接: http: //curetogether.com/cluster-headaches/treatments/

叢集性頭痛治療圖例 叢集性頭痛治療

什麼是強調有效性的最佳方式,同時仍然可以輕鬆比較治療並查看有多少患者對每種治療進行評分?我的想法是以百分比的形式顯示有效性,但我不確定如何使它們易於比較並顯示嘗試每種方法的患者數量。

謝謝!

您希望比較“有效性”並評估報告每種治療的患者數量。有效性記錄在五個離散的有序類別中,但(不知何故)也總結為“平均”。(平均值)值,表明它被認為是一個定量變量。

因此,我們應該選擇其元素非常適合傳達此類信息的圖形。在眾多優秀的解決方案中,有一個使用這種模式:

  • 將總或平均有效性表示為沿線性比例的位置。這樣的位置最容易在視覺上掌握並準確地定量閱讀。使所有 34 種治療方法通用的量表。
  • 用一些容易看出與這些數字成正比的圖形符號來表示患者的數量。矩形非常適合:它們可以定位以滿足上述要求,並在正交方向上調整大小,以便它們的高度和麵積都傳達患者編號信息。
  • 通過顏色和/或陰影值區分五個有效性類別。保持這些類別的順序。

問題中的圖形所犯的一個巨大錯誤是,最突出的視覺值——條形的長度——描述了患者數量信息,而不是總體有效性信息。我們可以通過圍繞自然中間值重新定位每個條形來輕鬆解決此問題。

不做任何其他更改(例如改進配色方案,這對任何色盲的人來說都特別差),這裡是重新設計。

數字

我添加了水平虛線以幫助眼睛將標籤與繪圖連接起來,並刪除了一條細垂直線以顯示共同的中心位置。

響應的模式和數量更加明顯。特別是,我們基本上以一張圖的價格得到了兩張圖:在左側,我們可以讀出不利影響的衡量標準,而在右側,我們可以看到積極影響的強度。一方面,能夠平衡風險與收益,另一方面,在此應用程序中很重要。

這種重新設計的一個意外效果是,具有許多反應的治療名稱與其他治療方法的名稱垂直分開,便於向下掃描並查看哪些治療方法最受歡迎。

另一個有趣的方面是,該圖質疑用於按“平均有效性”對治療進行排序的算法:例如,為什麼“頭痛追踪”在所有最受歡迎的治療中,它是唯一的沒有不良影響?

R附加了生成此圖的快速而骯髒的代碼。

x <- c(0,0,3,5,5,
      0,0,0,0,2,
      0,0,3,2,4,
      0,1,7,9,7,
      0,0,3,2,3,
      0,0,0,0,1,
      0,1,1,1,2,
      0,0,2,2,1,
      0,0,1,0,1,
      0,0,3,2,1,
      0,0,2,0,1,
      1,0,5,5,2,
      1,3,15,15,4,
      1,2,5,7,3,
      0,0,4,4,0,
      0,0,2,2,0,
      0,0,3,0,1,
      0,0,2,2,0,
      0,4,18,19,2,
      0,0,2,1,0,
      3,1,27,25,3,
      1,0,2,2,1,
      0,0,4,2,0,
      0,1,6,5,0,
      0,0,3,1,0,
      3,0,3,7,2,
      0,1,0,1,0,
      0,0,21,4,2,
      0,0,6,1,0,
      1,0,2,0,1,
      2,4,15,8,1,
      1,1,3,1,0,
      0,0,1,0,0,
      0,0,1,0,0)
levels <- c("Made it much worse", "Made it slightly worse", "No effect or uncertain",
           "Moderate improvement", "Major improvement")
treatments <-  c("Oxygen", "Gluten-free diet", "Zomig", "Sumatriptan", "Rizatriptan (Maxalt)",
                "Dilaudid suppository", "Dilaudid-Morphine", "Verapamil",
                "Magic mushrooms", "Magnesium", "Psilocybine", "Excedrin Migraine",
                "Ice packs on neck and head", "Passage of time", "Red Bull", "Lidocaine",
                "Vitamin B-2 (Roboflavin)", "Caffergot", "Caffeine", "Tobasco in nose / on tongue")
treatments <- c(treatments, 
                "Ibuprofen", "Topamax", "Excedrin Tension Headache", "Acetaminophen (Tylenol)",
                "Extra Strength Excedrin", "Hot water bottle", "Eletriptan", 
                "Headache tracking", "Women to Women vitamins", "Effexor", "Aspirin",
                "Propanolol", "L-Arginine", "Fioricet")
x <- t(matrix(x, 5, dimnames=list(levels, treatments)))
#
# Precomputation for plotting.
#
n <- dim(x)[1]
m <- dim(x)[2]
d <- as.data.frame(x)
d$Total <- rowSums(d)
d$Effectiveness <- (x %*% c(-2,-1,0,1,2)) / d$Total
d$Root <- (d$Total)
#
# Set up the plot area.
#
colors <- c("#704030", "#d07030", "#d0d0d0", "#60c060", "#387038")
x.left <- 0; x.right <- 6; dx <- x.right - x.left; x.0 <- x.left-4
y.bottom <- 0; y.top <- 10; dy <- y.top - y.bottom
gap <- 0.4
par(mfrow=c(1,1))
plot(c(x.left-1, x.right), c(y.bottom, y.top), type="n", 
    bty="n", xaxt="n", yaxt="n", xlab="", ylab="", asp=(y.top-y.bottom)/(dx+1))
#
# Make the plots.
#
u <- t(apply(x, 1, function(z) c(0, cumsum(z)) / sum(z)))
y <- y.top - dy * c(0, cumsum(d$Root/sum(d$Root) + gap/n)) / (1+gap)

invisible(sapply(1:n, function(i) {
 lines(x=c(x.0+1/4, x.right), y=rep(dy*gap/(2*n)+(y[i]+y[i+1])/2, 2),
       lty=3, col="#e0e0e0")
 sapply(1:m, function(j) {
 mid <- (x.left - (u[i,3] + u[i,4])/2)*dx
 rect(mid + u[i,j]*dx, y[i+1] + (gap/n)*(y.top-y.bottom), 
      mid + u[i,j+1]*dx, y[i], 
      col=colors[j], border=NA)
})}))
abline(v = x.left, col="White")
labels <- mapply(function(s,n) paste0(s, " (", n, ")"), rownames(x), d$Total)
text(x.0, (y[-(n+1)]+y[-1])/2, labels=labels, adj=c(1, 0), cex=0.8,
    col="#505050")

引用自:https://stats.stackexchange.com/questions/131211

comments powered by Disqus