การสร้างธีม ggplot: สีที่กำหนดเองสำหรับระดับตัวแปร

ฉันกำลังพยายามสร้างธีมใหม่ใน ggplot2 สำหรับการวางแผนพรรคการเมืองสำหรับประเทศของฉัน ฉันต้องการตั้งค่าสีสำหรับบางพรรคและธีมอื่นๆ เช่น Random_party_1 y Random_party_2 ตั้งค่าสีแบบสุ่ม

data <- data.frame(party = c('FA','PN', 'random_party1','random_party2', 'FA','PN', 'random_party1','random_party2'), 
                   year = c(2010, 2010, 2010, 2010, 2008, 2008, 2008, 2008), 
                   value = c(50, 20, 30, 10, 50, 50, NA, NA), 
                   color = c('#013197','#B0C2D3','assign_random_color1','assign_random_color2','#013197','#B0C2D3','assign_random_color','assign_random_color'))

จากนั้นฉันต้องการใช้สิ่งนี้เป็นอาร์กิวเมนต์การเติมหรือสี แต่ฉันไม่รู้ว่าจะนำไปใช้อย่างไรโดยไม่ต้องประกาศด้วยตนเองเพราะมันจะขึ้นอยู่กับข้อมูลของแต่ละปี:

cols <- c("FA" = "#013197", "PN" = "#B0C2D3", "random_party1" = "assign_random_color1", "random_party2" = "assign_random_color2")
p + scale_colour_manual(values = cols)

person Paula    schedule 11.06.2020    source แหล่งที่มา
comment
ฉันไม่แน่ใจว่าฉันเข้าใจคำถามของคุณ คุณสามารถใช้สีใดก็ได้ (สุ่ม) แล้วเติมลงใน "assign_random_color1"? ตัวอย่างของคุณใช้ได้กับฉัน ยกเว้นว่า assign_random_color1 ไม่ใช่สีที่ถูกต้อง   -  person Vandenman    schedule 11.06.2020


คำตอบ (1)


ฉันคิดว่าวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้คือการใช้ฟังก์ชันที่กำหนดเอง:

colorize <- function(vec)
{
  levs <- if(is.factor(vec)) levels(vec) else levels(factor(vec))
  predefined <- c("FA", "PN")
  pal <- c('#013197','#B0C2D3')
  pal <- pal[match(levs, predefined)]
  blanks <- which(is.na(pal))
  pal[blanks] <- sample(colours(100), length(blanks))
  pal
}

สมมติว่าเราสร้างโครงเรื่องของคุณดังนี้:

p <- ggplot(data, aes(factor(year), value, fill = party)) + geom_col(position = "dodge")

จากนั้นเราสามารถรันโค้ดของเราหนึ่งครั้งเพื่อรับสีคงที่สำหรับฝ่ายที่กำหนดไว้ล่วงหน้าและสีสุ่มสำหรับฝ่ายที่ไม่ได้รับมอบหมาย:

p + scale_fill_manual(values =  colorize(data$party))

ป้อนคำอธิบายรูปภาพที่นี่

และเราจะเห็นเฉพาะสีของฝ่ายสุ่มเท่านั้นที่เปลี่ยนไปหากเรารันโค้ดเดิมทุกประการอีกครั้ง:

p + scale_fill_manual(values =  colorize(data$party))

ป้อนคำอธิบายรูปภาพที่นี่

สร้างเมื่อ 11-06-2020 โดย แพ็คเกจ reprex (v0.3.0)

person Allan Cameron    schedule 11.06.2020