วิธีเพิ่มพื้นผิวเพื่อเติมสีใน ggplot2


103

ฉันกำลังใช้scale_brewer()สำหรับเติมสีและสีเหล่านี้ดูสวยงาม (บนหน้าจอและผ่านเครื่องพิมพ์สี) แต่พิมพ์ค่อนข้างสม่ำเสมอเป็นสีเทาเมื่อใช้เครื่องพิมพ์ขาวดำ ฉันค้นหาggplot2เอกสารออนไลน์แต่ไม่เห็นอะไรเกี่ยวกับการเพิ่มพื้นผิวเพื่อเติมสี มีggplot2วิธีอย่างเป็นทางการในการทำเช่นนี้หรือใครมีแฮ็คที่พวกเขาใช้? ตามพื้นผิวฉันหมายถึงสิ่งต่างๆเช่นแท่งทแยงมุมแท่งทแยงมุมย้อนกลับรูปแบบจุด ฯลฯ ที่จะแยกสีเติมเมื่อพิมพ์เป็นขาวดำ


คำตอบ:


34

ggplot สามารถใช้จานสีแบ่งสี บางส่วนเป็นแบบ "ถ่ายเอกสาร" mabe สิ่งนี้จะเหมาะกับคุณหรือไม่?

ggplot(diamonds, aes(x=cut, y=price, group=cut))+
geom_boxplot(aes(fill=cut))+scale_fill_brewer(palette="OrRd")

ในกรณีนี้ OrRd คือจานสีที่พบในหน้าเว็บ colorbrewer: http://colorbrewer2.org/

ถ่ายเอกสารได้ง่าย: แสดงว่าโทนสีที่กำหนดจะทนต่อการถ่ายเอกสารขาวดำ ไม่สามารถถ่ายสำเนาแผนการโอนย้ายได้สำเร็จ ความแตกต่างของความสว่างควรได้รับการรักษาไว้ด้วยรูปแบบลำดับ


24
ไม่ตอบคำถามของอปท. ฉันมาที่นี่เพราะฉันติดอยู่กับสีบางสี 'คำตอบ' ที่ยอมรับนี้ไม่ได้แนะนำวิธีใช้พื้นผิว
MS Berends

3
@MSBerends มันไม่ได้ตอบคำถามของคุณ ค่อนข้างแน่ใจว่าเครื่องหมายถูกสีเขียวเป็นสัญญาณว่าตอบคำถามแล้ว!
Yan Foto

10
อย่าหลงกลด้วยเครื่องหมายถูก คำถามคือวิธีใช้พื้นผิว - แต่ไม่มีคำตอบ มีการให้แนวคิดนอกกรอบใช่ แต่ไม่ใช่คำตอบสำหรับคำถาม
MS Berends

84

เฮ้คนนี่คือแฮ็กกระจ้อยร่อยที่แก้ไขปัญหาพื้นผิวในรูปแบบพื้นฐาน:

ggplot2: ทำให้เส้นขอบบนแถบหนึ่งเข้มกว่าแถบอื่นโดยใช้ R

แก้ไข: ในที่สุดฉันก็พบว่ามีเวลาให้ตัวอย่างสั้น ๆ ของแฮ็คนี้ซึ่งอนุญาตให้มีรูปแบบพื้นฐานอย่างน้อย 3 ประเภทใน ggplot2 รหัส:

Example.Data<- data.frame(matrix(vector(), 0, 3, dimnames=list(c(), c("Value", "Variable", "Fill"))), stringsAsFactors=F)

Example.Data[1, ] <- c(45, 'Horizontal Pattern','Horizontal Pattern' )
Example.Data[2, ] <- c(65, 'Vertical Pattern','Vertical Pattern' )
Example.Data[3, ] <- c(89, 'Mesh Pattern','Mesh Pattern' )


HighlightDataVert<-Example.Data[2, ]
HighlightHorizontal<-Example.Data[1, ]
HighlightMesh<-Example.Data[3, ]
HighlightHorizontal$Value<-as.numeric(HighlightHorizontal$Value)
Example.Data$Value<-as.numeric(Example.Data$Value)

HighlightDataVert$Value<-as.numeric(HighlightDataVert$Value)
HighlightMesh$Value<-as.numeric(HighlightMesh$Value)
HighlightHorizontal$Value<-HighlightHorizontal$Value-5
HighlightHorizontal2<-HighlightHorizontal
HighlightHorizontal2$Value<-HighlightHorizontal$Value-5
HighlightHorizontal3<-HighlightHorizontal2
HighlightHorizontal3$Value<-HighlightHorizontal2$Value-5
HighlightHorizontal4<-HighlightHorizontal3
HighlightHorizontal4$Value<-HighlightHorizontal3$Value-5
HighlightHorizontal5<-HighlightHorizontal4
HighlightHorizontal5$Value<-HighlightHorizontal4$Value-5
HighlightHorizontal6<-HighlightHorizontal5
HighlightHorizontal6$Value<-HighlightHorizontal5$Value-5
HighlightHorizontal7<-HighlightHorizontal6
HighlightHorizontal7$Value<-HighlightHorizontal6$Value-5
HighlightHorizontal8<-HighlightHorizontal7
HighlightHorizontal8$Value<-HighlightHorizontal7$Value-5

HighlightMeshHoriz<-HighlightMesh
HighlightMeshHoriz$Value<-HighlightMeshHoriz$Value-5
HighlightMeshHoriz2<-HighlightMeshHoriz
HighlightMeshHoriz2$Value<-HighlightMeshHoriz2$Value-5
HighlightMeshHoriz3<-HighlightMeshHoriz2
HighlightMeshHoriz3$Value<-HighlightMeshHoriz3$Value-5
HighlightMeshHoriz4<-HighlightMeshHoriz3
HighlightMeshHoriz4$Value<-HighlightMeshHoriz4$Value-5
HighlightMeshHoriz5<-HighlightMeshHoriz4
HighlightMeshHoriz5$Value<-HighlightMeshHoriz5$Value-5
HighlightMeshHoriz6<-HighlightMeshHoriz5
HighlightMeshHoriz6$Value<-HighlightMeshHoriz6$Value-5
HighlightMeshHoriz7<-HighlightMeshHoriz6
HighlightMeshHoriz7$Value<-HighlightMeshHoriz7$Value-5
HighlightMeshHoriz8<-HighlightMeshHoriz7
HighlightMeshHoriz8$Value<-HighlightMeshHoriz8$Value-5
HighlightMeshHoriz9<-HighlightMeshHoriz8
HighlightMeshHoriz9$Value<-HighlightMeshHoriz9$Value-5
HighlightMeshHoriz10<-HighlightMeshHoriz9
HighlightMeshHoriz10$Value<-HighlightMeshHoriz10$Value-5
HighlightMeshHoriz11<-HighlightMeshHoriz10
HighlightMeshHoriz11$Value<-HighlightMeshHoriz11$Value-5
HighlightMeshHoriz12<-HighlightMeshHoriz11
HighlightMeshHoriz12$Value<-HighlightMeshHoriz12$Value-5
HighlightMeshHoriz13<-HighlightMeshHoriz12
HighlightMeshHoriz13$Value<-HighlightMeshHoriz13$Value-5
HighlightMeshHoriz14<-HighlightMeshHoriz13
HighlightMeshHoriz14$Value<-HighlightMeshHoriz14$Value-5
HighlightMeshHoriz15<-HighlightMeshHoriz14
HighlightMeshHoriz15$Value<-HighlightMeshHoriz15$Value-5
HighlightMeshHoriz16<-HighlightMeshHoriz15
HighlightMeshHoriz16$Value<-HighlightMeshHoriz16$Value-5
HighlightMeshHoriz17<-HighlightMeshHoriz16
HighlightMeshHoriz17$Value<-HighlightMeshHoriz17$Value-5

ggplot(Example.Data, aes(x=Variable, y=Value, fill=Fill)) + theme_bw() + #facet_wrap(~Product, nrow=1)+ #Ensure theme_bw are there to create borders
  theme(legend.position = "none")+
  scale_fill_grey(start=.4)+
  #scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))+
  geom_bar(position=position_dodge(.9), stat="identity", colour="black", legend = FALSE)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+  
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0) +
  geom_bar(data=HighlightHorizontal, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal2, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal3, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal4, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal5, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal6, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal7, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal8, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
 geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0)+
  geom_bar(data=HighlightMeshHoriz, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
geom_bar(data=HighlightMeshHoriz2, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz3, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz4, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz5, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz6, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz7, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz8, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz9, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz10, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz11, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz12, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz13, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz14, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz15, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz16, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz17, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")

ผลิตสิ่งนี้:

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

มันไม่สวยสุด ๆ แต่เป็นทางออกเดียวที่ฉันคิดได้

ดังจะเห็นได้ว่าฉันสร้างข้อมูลพื้นฐานบางอย่าง เพื่อให้ได้เส้นแนวตั้งฉันเพียงแค่สร้างกรอบข้อมูลเพื่อบรรจุตัวแปรที่ฉันต้องการเพิ่มเส้นแนวตั้งและวาดเส้นขอบกราฟใหม่หลาย ๆ ครั้งเพื่อลดความกว้างในแต่ละครั้ง

มีการทำสิ่งที่คล้ายกันสำหรับเส้นแนวนอน แต่จำเป็นต้องมีกรอบข้อมูลใหม่สำหรับการวาดใหม่แต่ละครั้งโดยที่ฉันได้ลบค่า (ในตัวอย่าง '5') ออกจากค่าที่เกี่ยวข้องกับตัวแปรที่สนใจ ลดความสูงของแท่งได้อย่างมีประสิทธิภาพ นี่เป็นเรื่องยากที่จะบรรลุและอาจมีแนวทางที่คล่องตัวกว่านี้ แต่สิ่งนี้แสดงให้เห็นว่าจะบรรลุได้อย่างไร

รูปแบบตาข่ายเป็นการผสมผสานของทั้งสองอย่าง ประการแรกวาดเส้นแนวตั้งแล้วเพิ่มเส้นแนวนอนตั้งค่าfillเป็นfill='transparent'เพื่อให้แน่ใจว่าเส้นแนวตั้งยังไม่ได้เบิกมากกว่า

จนกว่าจะมีการอัปเดตรูปแบบฉันหวังว่าบางท่านจะพบว่าสิ่งนี้มีประโยชน์

แก้ไข 2:

นอกจากนี้ยังอาจเพิ่มลวดลายเส้นทแยงมุม ฉันเพิ่มตัวแปรพิเศษใน data frame:

Example.Data[4,] <- c(20, 'Diagonal Pattern','Diagonal Pattern' )

จากนั้นฉันสร้างกรอบข้อมูลใหม่เพื่อเก็บพิกัดสำหรับเส้นทแยงมุม:

Diag <- data.frame(
  x = c(1,1,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y = c(0,0,20,20),
  x2 = c(1.2,1.2,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y2 = c(0,0,11.5,11.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x3 = c(1.38,1.38,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y3 = c(0,0,3.5,3.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x4 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y4 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x5 = c(.6,.6,1.07,1.07), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y5 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x6 = c(.555,.555,.88,.88), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y6 = c(6,6,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x7 = c(.555,.555,.72,.72), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y7 = c(13,13,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x8 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y8 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  #Variable = "Diagonal Pattern",
  Fill = "Diagonal Pattern"
  )

จากนั้นฉันเพิ่ม geom_paths ลงใน ggplot ด้านบนโดยแต่ละอันเรียกพิกัดที่แตกต่างกันและลากเส้นบนแถบที่ต้องการ:

+geom_path(data=Diag, aes(x=x, y=y),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x2, y=y2),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x3, y=y3),colour = "black")+
  geom_path(data=Diag, aes(x=x4, y=y4),colour = "black")+
  geom_path(data=Diag, aes(x=x5, y=y5),colour = "black")+
  geom_path(data=Diag, aes(x=x6, y=y6),colour = "black")+
  geom_path(data=Diag, aes(x=x7, y=y7),colour = "black")

ผลลัพธ์ดังต่อไปนี้:

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

มันค่อนข้างเลอะเทอะเพราะฉันไม่ได้ใช้เวลามากเกินไปในการทำให้เส้นมีมุมที่พอดีและเว้นระยะห่างกัน แต่สิ่งนี้ควรเป็นหลักฐานยืนยันแนวคิด

เห็นได้ชัดว่าเส้นสามารถเอนไปในทิศทางตรงกันข้ามได้และยังมีที่ว่างสำหรับการตัดขวางในแนวทแยงเช่นเดียวกับตาข่ายแนวนอนและแนวตั้ง

ฉันคิดว่านั่นคือทั้งหมดที่ฉันสามารถนำเสนอได้ที่ด้านหน้าของรูปแบบ หวังว่าจะมีคนหามาใช้นะ

แก้ไข 3: คำพูดสุดท้ายที่มีชื่อเสียง ฉันมีตัวเลือกรูปแบบอื่น ครั้งนี้โดยใช้geom_jitter.

อีกครั้งฉันเพิ่มตัวแปรอื่นในกรอบข้อมูล:

Example.Data[5,] <- c(100, 'Bubble Pattern','Bubble Pattern' )

และฉันสั่งว่าฉันต้องการให้แต่ละรูปแบบนำเสนออย่างไร:

Example.Data$Variable = Relevel(Example.Data$Variable, ref = c("Diagonal Pattern", "Bubble Pattern","Horizontal Pattern","Mesh Pattern","Vertical Pattern"))

ต่อไปฉันสร้างคอลัมน์เพื่อให้มีตัวเลขที่เกี่ยวข้องกับแถบเป้าหมายที่ต้องการบนแกน x:

Example.Data$Bubbles <- 2

ตามด้วยคอลัมน์เพื่อให้มีตำแหน่งบนแกน y ของ 'ฟองอากาศ':

Example.Data$Points <- c(5, 10, 15, 20, 25)
Example.Data$Points2 <- c(30, 35, 40, 45, 50)
Example.Data$Points3 <- c(55, 60, 65, 70, 75)
Example.Data$Points4 <- c(80, 85, 90, 95, 7)
Example.Data$Points5 <- c(14, 21, 28, 35, 42)
Example.Data$Points6 <- c(49, 56, 63, 71, 78)
Example.Data$Points7 <- c(84, 91, 98, 6, 12)

ในที่สุดฉันก็เพิ่มgeom_jitters ลงใน ggplot ด้านบนโดยใช้คอลัมน์ใหม่สำหรับการวางตำแหน่งและใช้ 'Points' อีกครั้งเพื่อเปลี่ยนขนาดของ 'ฟองอากาศ':

+geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)

ทุกครั้งที่ดำเนินการพล็อตกระวนกระวายใจจะวางตำแหน่ง 'ฟองอากาศ' แตกต่างกัน แต่นี่เป็นหนึ่งในผลลัพธ์ที่ดีกว่าที่ฉันมี:

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

บางครั้ง 'ฟองอากาศ' จะกระวนกระวายใจนอกพรมแดน หากสิ่งนี้เกิดขึ้นอีกครั้งหรือเพียงแค่ส่งออกในขนาดที่ใหญ่ขึ้น สามารถพล็อตฟองเพิ่มเติมได้ในแต่ละส่วนที่เพิ่มขึ้นบนแกน y ซึ่งจะเติมช่องว่างให้มากขึ้นหากคุณต้องการ

ซึ่งมีมากถึง 7 รูปแบบ (หากคุณรวมเส้นทแยงมุมตรงข้ามและตาข่ายแนวทแยงของทั้งสองอย่าง) ที่สามารถแฮ็กใน ggplot ได้

โปรดอย่าลังเลที่จะแนะนำเพิ่มเติมหากใครพอจะนึกออกบ้าง

แก้ไข 4: ฉันได้ทำงานกับฟังก์ชัน wrapper เพื่อทำการฟักไข่ / รูปแบบอัตโนมัติใน ggplot2 ฉันจะโพสต์ลิงค์เมื่อฉันได้ขยายฟังก์ชันเพื่ออนุญาตรูปแบบในแปลง facet_grid เป็นต้นนี่คือผลลัพธ์ที่มีอินพุตฟังก์ชันสำหรับพล็อตแท่งง่ายๆดังตัวอย่าง:

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

ฉันจะเพิ่มการแก้ไขครั้งสุดท้ายเมื่อฉันมีฟังก์ชันพร้อมที่จะแชร์

แก้ไข 5: นี่คือลิงค์ไปยังฟังก์ชัน EggHatch ที่ฉันเขียนเพื่อทำให้กระบวนการเพิ่มรูปแบบลงใน geom_bar พล็อตง่ายขึ้นเล็กน้อย


เก่งมาก! อย่างไรก็ตามดูเหมือนว่าโซลูชันนี้ใช้ได้กับพล็อตแท่งเท่านั้นหรือ?
SkyWalker

@Giovanni Azua ฉันได้ลองใช้แค่เรื่องบาร์เท่านั้น เมื่อฉันหาเวลาได้ฉันจะพยายามปรับฟังก์ชั่นที่เชื่อมโยงสำหรับพล็อตแบบเรียงซ้อนเป็นต้น
Docconcoct

71

ขณะนี้ยังไม่สามารถทำได้เนื่องจากกริด (ระบบกราฟิกที่ ggplot2 ใช้ในการวาดภาพจริง) ไม่รองรับพื้นผิว ขออภัย!


70
มีแผนที่จะเพิ่ม gridextra เป็นการอ้างอิงเพื่อรับฟังก์ชันนี้หรือไม่?
russellpierce

มีข่าวเกี่ยวกับเรื่องนี้ไหม?
Hrant

1
สิ่งนี้อาจเปลี่ยนแปลงได้ในอนาคตอันไม่ไกลนี้ ดูการสนทนานี้สร้างเมื่อการเปลี่ยนแปลงที่จะเกิดขึ้นในแพคเกจตารางอาร์เอส
stragu

22

คุณสามารถใช้ggtexturesแพคเกจโดย@claus Wilkeggplot2การวาดรูปสี่เหลี่ยมพื้นผิวและบาร์ที่มี

# Image/pattern randomly selected from README
path_image <- "http://www.hypergridbusiness.com/wp-content/uploads/2012/12/rocks2-256.jpg"

library(ggplot2)
# devtools::install_github("clauswilke/ggtextures")
ggplot(mtcars, aes(cyl, mpg)) + 
  ggtextures::geom_textured_bar(stat = "identity", image = path_image)

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

คุณยังสามารถใช้ร่วมกับ geoms อื่น ๆ ได้อีกด้วย:

data_raw <- data.frame(x = round(rbinom(1000, 50, 0.1)))
ggplot(data_raw, aes(x)) +
  geom_textured_bar(
    aes(y = ..prop..), image = path_image
  ) +
  geom_density()

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


2
ขอบคุณที่ย้ายคำตอบของคุณ @PoGibas ฉันพนันได้เลยว่ามันจะได้รับความสนใจมากขึ้น (สมควร) ที่นี่! Cheers
Henrik

ทางออกที่ดีมาก
Docconcoct

4
ตรวจสอบรูปแบบดาวน์โหลดได้ที่นี่: heropatterns.com
Nova

ตอนนี้ฉันต้องหาวิธีแก้ไขความโปร่งใสใน R .. haha
Nova

3

ฉันเพิ่งค้นพบแพ็คเกจชื่อggpattern( https://github.com/coolbutuseless/ggpattern ) ซึ่งดูเหมือนจะเป็นทางออกที่ดีสำหรับปัญหานี้และรวมเข้ากับเวิร์กโฟลว์ ggplot2 ได้เป็นอย่างดี แม้ว่าโซลูชันที่ใช้พื้นผิวอาจใช้งานได้ดีสำหรับแท่งแนวทแยง แต่ก็จะไม่สร้างกราฟิกแบบเวกเตอร์และไม่เหมาะสม

นี่คือตัวอย่างที่นำมาโดยตรงจากที่เก็บ github ของ ggpattern:

install.packages("remotes")
remotes::install_github("coolbutuseless/ggpattern")

library(ggplot2)
library(ggpattern)

df <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1))

ggplot(df) +
  geom_col_pattern(
    aes(level, outcome, pattern_fill = level), 
    pattern = 'stripe',
    fill    = 'white',
    colour  = 'black'
  ) +
  theme_bw(18) +
  theme(legend.position = 'none') + 
  labs(
    title    = "ggpattern::geom_pattern_col()",
    subtitle = "pattern = 'stripe'"
  ) +
  coord_fixed(ratio = 1/2)

ซึ่งผลลัพธ์ในพล็อตนี้:

พล็อตตัวอย่าง ggpattern

หากแถบบางส่วนควรเป็นลายทางให้geom_col_pattern()มีpattern_alphaอาร์กิวเมนต์ที่สามารถใช้เพื่อทำให้แถบที่ไม่ต้องการบางส่วนโปร่งใสได้อย่างสมบูรณ์


2

ผมคิดว่าDocconcoctทำงานดีมาก แต่ตอนนี้ฉัน googled จู่แพคเกจพิเศษ --- Patternplot ไม่เห็นรหัสภายใน แต่ดูเหมือนว่าบทความสั้นจะมีประโยชน์



1

อาจเป็นประโยชน์ในการสร้างกรอบข้อมูลจำลองที่มีรูปทรงสอดคล้องกับ "พื้นผิว" จากนั้นใช้ geom_contour นี่คือตัวอย่างของฉัน:

library(ggplot2)

eg = expand.grid(R1 = seq(0,1,by=0.01), R2 = seq(0,1,by=0.01))
     eg$importance = (eg$R1+eg$R2)/2

  ggplot(eg , aes(x = R1, y = R2)) +
  geom_raster(aes(fill = importance), interpolate=TRUE) +
  scale_fill_gradient2(low="white", high="gray20", limits=c(0,1)) +
  theme_classic()+
  geom_contour(bins=5,aes(z=importance), color="black", size=0.6)+
  coord_fixed(ratio = 1, xlim=c(0,1),ylim=c(0,1))

และนี่คือผลลัพธ์: พล็อตแรเงาพร้อมเส้น

(เส้นควรจะเรียบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.