如何可视化百分比以及条目数。


10

我正在尝试找出可视化下表的最佳方法,并强调与尝试该治疗的患者人数相对应的治疗效果。这是实际页面的链接:http : //curetogether.com/cluster-headaches/treatments/

丛集性头痛治疗传奇 丛集性头痛治疗

在强调疗效的同时,仍然可以轻松比较治疗方案并查看每例有多少患者的最佳方法是什么?我的想法是将有效性显示为百分比,但是我不确定如何使它们易于比较并显示尝试每种方法的患者人数。

谢谢!


(请不要使用饼形图。) “在强调疗效的同时仍可轻松比较治疗方法”是指以下事实:例如,很难确定是否由于基线而导致caffeineibuprofen导致更高的可能性moderate improvement不同?或者是其他东西?
gung-恢复莫妮卡

Answers:


12

您希望比较“有效性”并评估报告每种治疗的患者人数。有效性记录在五个离散的有序类别中,但(以某种方式)也总结为“平均”。(平均)值,表明它被视为定量变量。

因此,我们应该选择一种图形,其元素非常适合传达此类信息。在许多出色的解决方案中,有一种使用以下模式:

  • 将总体或平均有效性表示为线性范围内的一个位置。这些位置最容易从视觉上把握,并且可以准确地定量读取。使量表对所有34种治疗都通用。

  • 用一些图形符号表示患者人数,这些图形符号很容易看出与这些数字成正比。矩形非常适合:它们的位置可以满足前面的要求,并且在正交方向上可以调整大小,以便它们的高度和面积都可以传达患者编号信息。

  • 通过颜色和/或阴影值区分五个有效性类别。保持这些类别的顺序。

图形在问题中造成的一个巨大错误是,最突出的视觉价值(条形图的长度)描述的是患者人数信息,而不是总的有效性信息。我们可以解决这个问题很容易recentering关于自然中间值的每个栏。

在不进行任何其他更改的情况下(例如改进配色方案,这对于任何色盲人员而言都是极差的),这是重新设计。

数字

我添加了水平虚线以帮助眼睛将标签与图表连接起来,并删除了细的垂直线以显示公共的中心位置。

响应的方式和数量更为明显。特别是,我们基本上以一个价格获得了两个图形:在左侧,我们可以读出不良影响的度量,而在右侧,我们可以看到正面的影响有多强。在此应用程序中,一方面要平衡风险与利益,另一方面,这一点很重要。

这项重新设计的意外效果是,具有多种反应的治疗名称与其他治疗的名称在垂直方向上是分开的,因此可以轻松浏览下来并查看最受欢迎的治疗。

另一个有趣的方面是,该图形质疑用于通过“平均有效性”对治疗进行排序的算法:例如,为什么在所有最受欢迎的治疗方法中,“头痛追踪”如此之低的原因没有不良影响?

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")

哇,谢谢你这么清晰和彻底的回答。这是可视化所有信息的绝佳解决方案。您生成的示例图确实有助于一目了然地掌握答案,这也很有帮助。谢谢!
David Hobs,2015年

2
(+1)视觉效果不错。值得注意的是,likertHH R软件包具有用于专门针对Likert刻度的堆叠条形图的功能。在后一种包装中,甚至有可能使每个条形的高度根据样品大小而变化(请参见本JSS论文中的第12页)。
chl

3

您当然可以将每一行转换成百分比,然后将所有条形图绘制成相同的长度,其中绿色的条形图部分可以很好地直观地指示有效性。您可以将数字保留在旁边的方括号中,以指示结果所基于的样本量。

如果您想保留样品数量和有效性的直观指示,则可以按原样考虑图表,但以灰色部分的中心为中心。然后,条形的总体大小将直观地指示样品的大小,并且条形在中心线右侧(或左侧)的比例将指示有效性(或其他方式)。结合起来,您可以从最右边的那些条形图上直观地看到受欢迎且经过评级的有效治疗方法。您可以按链接页面上可用的三种方式中的任何一种进行排序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.