Cách thêm kết cấu để tô màu trong ggplot2


103

Tôi hiện đang sử dụng scale_brewer()để tô màu và chúng có màu sắc đẹp (trên màn hình và qua máy in màu) nhưng in tương đối đồng đều dưới dạng xám khi sử dụng máy in đen trắng. Tôi đã tìm kiếm ggplot2tài liệu trực tuyến nhưng không thấy bất cứ điều gì về việc thêm kết cấu để tô màu. Có ggplot2cách nào chính thức để thực hiện việc này không hoặc có ai có bản hack mà họ sử dụng không? Theo kết cấu, ý tôi là những thứ như thanh chéo, thanh chéo ngược, mẫu dấu chấm, v.v. sẽ phân biệt màu tô khi được in đen trắng.


Câu trả lời:


35

ggplot có thể sử dụng bảng màu colorbrewer. Một số trong số này là thân thiện "photocopy". Vì vậy, mabe một cái gì đó như thế này sẽ làm việc cho bạn?

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

trong trường hợp này OrRd là một bảng màu được tìm thấy trên trang web colorbrewer: http://colorbrewer2.org/

Tính thân thiện với máy photocopy: Điều này chỉ ra rằng một bảng màu nhất định sẽ chịu được khi photocopy trắng đen. Không thể sao chép thành công lược đồ phân kỳ. Sự khác biệt về độ đậm nhạt nên được duy trì bằng các sơ đồ tuần tự.


22
Không trả lời câu hỏi của OP. Tôi đến đây bởi vì tôi bị mắc kẹt với một số màu sắc. 'Câu trả lời' được chấp nhận này không gợi ý cách áp dụng kết cấu.
MS Berends

3
@MSBerends nó không trả lời câu hỏi của bạn . Khá chắc chắn rằng dấu kiểm màu xanh lá cây là dấu hiệu cho thấy nó đã trả lời câu hỏi!
Yan Foto

10
Đừng để bị đánh lừa bởi một dấu kiểm. Câu hỏi là làm thế nào để áp dụng các kết cấu - và điều đó chưa được trả lời. Một ý tưởng bên ngoài hộp đã được cung cấp, có, nhưng không phải là câu trả lời cho câu hỏi.
MS Berends

83

Xin chào các bạn, đây là một bản hack nhỏ giải quyết vấn đề kết cấu theo cách rất cơ bản:

ggplot2: làm cho đường viền trên một thanh tối hơn các thanh khác bằng cách sử dụng R

CHỈNH SỬA: Cuối cùng tôi đã tìm thấy thời gian để đưa ra một ví dụ ngắn gọn về cách hack này cho phép ít nhất 3 loại mẫu cơ bản trong ggplot2. Mật mã:

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

Tạo ra cái này:

nhập mô tả hình ảnh ở đây

Nó không quá đẹp nhưng đó là giải pháp duy nhất tôi có thể nghĩ đến.

Có thể thấy tôi tạo ra một số dữ liệu rất cơ bản. Để có được các đường thẳng đứng, tôi chỉ cần tạo một khung dữ liệu để chứa biến mà tôi muốn thêm các đường thẳng đứng vào và vẽ lại các đường viền biểu đồ nhiều lần, giảm chiều rộng mỗi lần.

Điều tương tự cũng được thực hiện đối với các đường ngang nhưng cần có một khung dữ liệu mới cho mỗi lần vẽ lại mà tôi đã trừ một giá trị (trong ví dụ là '5') khỏi giá trị được liên kết với biến quan tâm. Hiệu quả hạ độ cao của thanh. Điều này thật khó đạt được và có thể có nhiều cách tiếp cận hợp lý hơn nhưng điều này minh họa cách đạt được nó.

Mẫu lưới là sự kết hợp của cả hai. Thứ nhất vẽ các đường thẳng đứng và sau đó thêm đường ngang thiết fillnhư fill='transparent'để đảm bảo các đường thẳng đứng không được vẽ trên.

Cho đến khi có bản cập nhật mẫu, tôi hy vọng một số bạn thấy điều này hữu ích.

CHỈNH SỬA 2:

Ngoài ra, các mẫu đường chéo cũng có thể được thêm vào. Tôi đã thêm một biến bổ sung vào khung dữ liệu:

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

Sau đó, tôi tạo một khung dữ liệu mới để giữ tọa độ cho các đường chéo:

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

Từ đó, tôi đã thêm geom_paths vào ggplot ở trên với mỗi cái gọi tọa độ khác nhau và vẽ các đường trên thanh mong muốn:

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

Điều này dẫn đến kết quả sau:

nhập mô tả hình ảnh ở đây

Nó hơi cẩu thả vì tôi đã không đầu tư quá nhiều thời gian vào việc tạo các đường thẳng góc và cách xa nhau một cách hoàn hảo nhưng đây sẽ là một bằng chứng về khái niệm.

Rõ ràng là các đường có thể nghiêng về hướng ngược lại và cũng có chỗ cho chia lưới theo đường chéo giống như chia lưới ngang và dọc.

Tôi nghĩ đó là tất cả những gì tôi có thể cung cấp trên mặt trận mẫu. Hy vọng ai đó có thể tìm thấy một sử dụng cho nó.

EDIT 3: Những lời cuối cùng nổi tiếng. Tôi đã nghĩ ra một tùy chọn mẫu khác. Lần này sử dụnggeom_jitter .

Một lần nữa, tôi đã thêm một Biến khác vào khung dữ liệu:

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

Và tôi đã đặt hàng theo cách tôi muốn mỗi mẫu được trình bày:

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

Tiếp theo, tôi tạo một cột để chứa số được liên kết với thanh mục tiêu dự định trên trục x:

Example.Data$Bubbles <- 2

Theo sau là các cột để chứa các vị trí trên trục y của 'bong bóng':

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)

Cuối cùng, tôi đã thêm geom_jitters vào ggplot ở trên bằng cách sử dụng các cột mới để định vị và sử dụng lại 'Điểm' để thay đổi kích thước của 'bong bóng':

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

Mỗi khi cốt truyện được chạy, các vị trí rung chuyển các 'bong bóng' khác nhau nhưng đây là một trong những kết quả đẹp hơn mà tôi có:

nhập mô tả hình ảnh ở đây

Đôi khi các 'bong bóng' sẽ rung chuyển bên ngoài đường viền. Nếu điều này xảy ra, hãy chạy lại hoặc chỉ cần xuất ở các kích thước lớn hơn. Nhiều bong bóng hơn có thể được vẽ trên mỗi gia số trên trục y, điều này sẽ lấp đầy nhiều khoảng trống hơn nếu bạn muốn.

Điều đó tạo nên tối đa 7 mẫu (nếu bạn bao gồm các đường chéo nghiêng đối diện và lưới chéo của cả hai) có thể bị tấn công trong ggplot.

Xin vui lòng đề xuất thêm nếu bất cứ ai có thể suy nghĩ về một số.

CHỈNH SỬA 4: Tôi đang làm việc trên một hàm wrapper để tự động hóa các mẫu / dấu gạch trong ggplot2. Tôi sẽ đăng một liên kết khi tôi đã mở rộng hàm để cho phép các mẫu trong biểu đồ facet_grid, v.v. Đây là kết quả đầu ra với đầu vào hàm cho một biểu đồ thanh đơn giản làm ví dụ:

nhập mô tả hình ảnh ở đây

Tôi sẽ thêm một lần chỉnh sửa cuối cùng khi tôi có chức năng sẵn sàng chia sẻ.

CHỈNH SỬA 5: Đây là một liên kết đến chức năng EggHatch mà tôi đã viết để làm cho quá trình thêm các mẫu vào biểu đồ geom_bar dễ dàng hơn một chút.


Làm tốt lắm! Tuy nhiên, có vẻ như giải pháp này chỉ có tác dụng đối với những mảnh ghép thanh hay?
SkyWalker

@Giovanni Azua Tôi chỉ thử nó cho các ô vuông có. Khi tôi tìm thấy thời gian tôi sẽ cố gắng và thích ứng với các chức năng liên quan cho lô xếp chồng lên nhau, vv
Docconcoct

70

Hiện không thể thực hiện được vì lưới (hệ thống đồ họa mà ggplot2 sử dụng để vẽ thực tế) không hỗ trợ kết cấu. Lấy làm tiếc!


70
Bạn có kế hoạch thêm Gridextra làm phụ thuộc để có được chức năng này không?
russellpierce

có gì mới về nó không?
Hrant

Điều này có thể thay đổi trong tương lai không xa. Xem thảo luận này , xây dựng dựa trên những thay đổi sắp tới gói lưới R .
stragu

21

Bạn có thể sử dụng gói ggtextures của @claus wilke để vẽ các hình chữ nhật và thanh có kết cấu ggplot2.

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

nhập mô tả hình ảnh ở đây

Bạn cũng có thể kết hợp nó với các geom khác:

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

nhập mô tả hình ảnh ở đây


2
Cảm ơn bạn đã chuyển câu trả lời của bạn @PoGibas. Tôi cá rằng nó sẽ nhận được nhiều sự chú ý (rất xứng đáng) ở đây! Chúc mừng
Henrik

Giải pháp rất tốt.
Docconcoct

4
Kiểm tra các mẫu có thể tải xuống tại đây: heropatterns.com
Nova

Bây giờ tôi chỉ cần tìm hiểu cách thay đổi độ trong suốt của chúng trong R .. haha
Nova

2

tôi nghĩ công việc của Docconcoct là tuyệt vời nhưng bây giờ tôi đột nhiên truy cập vào một gói đặc biệt --- Patternplot . Không thấy mã nội bộ nhưng họa tiết có vẻ hữu ích.



2

Tôi vừa phát hiện ra một gói có tên ggpattern( https://github.com/coolbutuseless/ggpattern ) có vẻ là giải pháp tốt cho vấn đề này và tích hợp tuyệt vời với quy trình làm việc ggplot2. Mặc dù các giải pháp sử dụng kết cấu có thể hoạt động tốt đối với các thanh chéo, nhưng chúng sẽ không tạo ra đồ họa vector và do đó không tối ưu.

Đây là một ví dụ được lấy trực tiếp từ kho lưu trữ github của 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)

kết quả trong âm mưu này:

âm mưu ví dụ ggpattern

Nếu chỉ một số thanh nên có sọc, geom_col_pattern()có một pattern_alphađối số có thể được sử dụng để làm cho một số sọc không mong muốn hoàn toàn trong suốt.


1

Có thể hữu ích khi tạo một khung dữ liệu giả có các đường bao tương ứng với "kết cấu" và sau đó sử dụng geom_contour. Đây là ví dụ của tôi:

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

Và đây là kết quả: âm mưu bóng mờ với các dòng

(các đường phải được làm mịn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.