ggplot2 barplots ที่มี errorbars เมื่อใช้ stacked bar
ฉันกำลังพยายามสร้าง barplot แบบเรียงซ้อนโดยมีแถบข้อผิดพลาดซึ่งแสดงถึงความแปรปรวนทั้งหมดต่อแท่ง ฉันไม่ต้องการใช้ barplot ที่หลบเพราะฉันมี> 10 หมวดหมู่ต่อแท่ง
ด้านล่างฉันมีข้อมูลตัวอย่างสำหรับตัวอย่างที่ทำซ้ำได้:
scenario = c('A','A','A','A')
strategy = c('A','A','A','A')
decile = c(0,0,10,10)
asset = c('A','B','A','B')
lower = c(10,20,10, 15)
mean = c(30,50,60, 70)
upper = c(70,90,86,90)
data = data.frame(scenario, strategy, decile, asset, lower, mean, upper)
และเมื่อเรามีdatadf แล้วเราสามารถใช้ ggplot2 เพื่อสร้างแถบแบบเรียงซ้อนได้ดังนี้:
ggplot(wide, aes(x=decile, y=mean, fill=asset)) +
geom_bar(stat="identity") +
facet_grid(strategy~scenario) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.25)
อย่างไรก็ตามแถบข้อผิดพลาดที่สร้างขึ้นมีไว้สำหรับแต่ละองค์ประกอบของแถบที่เรียงซ้อนกัน:
ฉันขอขอบคุณผลการนี้จากฉันให้lower, meanและupperสำหรับแถวของ DF แต่ละ แต่แม้เมื่อฉันสรุปเหล่านี้ต่อ decile ฉันไม่ได้รับ errorbars ต้องการของฉันที่ด้านบนของแต่ละบาร์สแต็ค
รหัส ggplot2 ที่ถูกต้องคืออะไรหรือโครงสร้างข้อมูลที่ถูกต้องในการเปิดใช้งานสิ่งนี้คืออะไร
คำตอบ
ฉันคิดว่าคุณถูกต้องในการตระหนักว่าคุณจำเป็นต้องจัดการข้อมูลของคุณแทนที่จะเป็นพล็อตของคุณ คุณไม่สามารถมีposition_stackบนแถบข้อผิดพลาดได้ดังนั้นคุณจะต้องคำนวณค่าเฉลี่ยค่าบนและค่าล่างของแถบข้อผิดพลาดใหม่ โดยพื้นฐานแล้วนี่หมายถึงการได้รับผลรวมสะสมของค่าเฉลี่ยและการเลื่อนช่วงบนและล่างให้สอดคล้องกัน คุณสามารถทำได้ภายในdplyrท่อ
หมายเหตุฉันคิดว่าคุณจะต้องมีposition_dodgeแถบแสดงข้อผิดพลาดเนื่องจากช่วงของมันทับซ้อนกันแม้ว่าจะเลื่อนอย่างเหมาะสมซึ่งจะทำให้ตีความด้วยสายตาได้ยากขึ้น:
library(ggplot2)
library(dplyr)
data %>%
mutate(lower = lower - mean, upper = upper - mean) %>%
group_by(decile) %>%
arrange(rev(asset), by.group = TRUE) %>%
mutate(mean2 = cumsum(mean), lower = lower + mean2, upper = upper + mean2) %>%
ggplot(aes(x = decile, y = mean, fill = asset)) +
geom_bar(stat = "identity") +
facet_grid(strategy ~ scenario) +
geom_errorbar(aes(y = mean2, ymin = lower, ymax = upper), width = 2,
position = position_dodge(width = 2)) +
geom_point(aes(y = mean2), position = position_dodge(width = 2))
หากคุณต้องการเพียงหนึ่งแถบข้อผิดพลาดต่อเดซิลคุณควรรวมค่าเพื่อไม่ให้มีความแตกต่างระหว่าง assest เช่นนี้:
library(ggplot2)
library(dplyr)
#Code
data %>% group_by(scenario,decile) %>%
mutate(nlower=mean(lower),nupper=mean(upper)) %>%
ggplot(aes(x=factor(decile), y=mean, fill=asset,group=scenario)) +
geom_bar(stat="identity") +
facet_grid(strategy~scenario) +
geom_errorbar(aes(ymin = nlower, ymax = nupper), width = 0.25)
เอาท์พุต:
เป็นอีกสิ่งหนึ่งที่ใช้สินทรัพย์เนื่องจากจะพิจารณาแต่ละคลาสเนื่องจากคุณมีค่าที่แตกต่างกันสำหรับแต่ละคลาส:
#Code 2
data %>%
ggplot(aes(x=factor(decile), y=mean, fill=asset,group=scenario)) +
geom_bar(stat="identity") +
facet_grid(strategy~scenario) +
geom_errorbar(aes(ymin = lower, ymax = upper), width = 0.25)
เอาท์พุต:
ในเวอร์ชันที่แล้วเนื้อหาแต่ละรายการจะมีแถบข้อผิดพลาดของตัวเอง แต่หากคุณต้องการดู erros ทั่วโลกคุณควรใช้วิธีการรวมขีด จำกัด เช่นเดียวกับที่ทำกับค่าเฉลี่ยหรือการวัดอื่น ๆ ที่คุณต้องการ