Bagaimana menambahkan tekstur untuk mengisi warna di ggplot2

103

Saat ini saya menggunakan scale_brewer()untuk isian dan ini terlihat indah dalam warna (di layar dan melalui printer warna) tetapi mencetak secara relatif seragam sebagai abu-abu saat menggunakan printer hitam dan putih. Saya mencari ggplot2dokumentasi online tetapi tidak melihat apapun tentang menambahkan tekstur untuk mengisi warna. Apakah ada cara resmi ggplot2untuk melakukan ini atau apakah ada yang memiliki peretasan yang mereka gunakan? Yang saya maksud dengan tekstur adalah hal-hal seperti batang diagonal, batang diagonal terbalik, pola titik, dll. Yang akan membedakan warna isian saat dicetak dalam hitam dan putih.

rhh
sumber

Jawaban:

35

ggplot dapat menggunakan palet colorbrewer. Beberapa di antaranya ramah "fotokopi". Jadi mabe sesuatu seperti ini akan berhasil untuk Anda?

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

dalam hal ini OrRd adalah palet yang ditemukan di halaman web colorbrewer: http://colorbrewer2.org/

Fotokopi Ramah: Ini menunjukkan bahwa skema warna tertentu akan tahan terhadap fotokopi hitam putih. Skema divergen tidak berhasil difotokopi. Perbedaan kecerahan harus dipertahankan dengan skema berurutan.

Andreas
sumber
23
Tidak menjawab pertanyaan OP. Saya datang ke sini karena saya terjebak pada warna tertentu. 'Jawaban' yang diterima ini tidak menyarankan bagaimana menerapkan tekstur.
MS Berends
3
@MSBerends itu tidak menjawab pertanyaan Anda . Cukup yakin bahwa tanda centang hijau adalah tanda telah menjawab pertanyaan!
Yan Foto
10
Jangan tertipu oleh tanda centang. Pertanyaannya adalah bagaimana menerapkan tekstur - dan itu tidak terjawab. Ide di luar kotak diberikan, ya, tetapi bukan jawaban atas pertanyaan.
MS Berends
83

Hai teman-teman, inilah peretasan wee yang membahas masalah tekstur dengan cara yang sangat mendasar:

ggplot2: buat garis tepi di satu batang lebih gelap dari yang lain menggunakan R

EDIT: Saya akhirnya menemukan waktu untuk memberikan contoh singkat tentang peretasan ini yang memungkinkan setidaknya 3 jenis pola dasar di ggplot2. Kode:

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

Menghasilkan ini:

masukkan deskripsi gambar di sini

Ini tidak super cantik tapi itu satu-satunya solusi yang bisa saya pikirkan.

Seperti yang dapat dilihat, saya menghasilkan beberapa data yang sangat mendasar. Untuk mendapatkan garis vertikal, saya cukup membuat bingkai data untuk memuat variabel yang ingin saya tambahkan garis vertikal dan menggambar ulang batas grafik beberapa kali mengurangi lebar setiap kali.

Hal serupa dilakukan untuk garis horizontal tetapi bingkai data baru diperlukan untuk setiap gambar ulang di mana saya telah mengurangi nilai (dalam contoh saya '5') dari nilai yang terkait dengan variabel yang diminati. Secara efektif menurunkan ketinggian bilah. Ini sulit untuk dicapai dan mungkin ada pendekatan yang lebih ramping tetapi ini menggambarkan bagaimana itu dapat dicapai.

Pola jala adalah kombinasi keduanya. Pertama menggambar garis vertikal dan kemudian menambahkan garis horizontal pengaturan fillsebagai fill='transparent'untuk memastikan garis vertikal tidak ditarik lebih.

Sampai ada pembaruan pola, saya harap beberapa dari Anda menganggap ini berguna.

EDIT 2:

Selain itu pola diagonal juga dapat ditambahkan. Saya menambahkan variabel tambahan ke bingkai data:

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

Kemudian saya membuat bingkai data baru untuk menampung koordinat garis diagonal:

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

Dari sana saya menambahkan geom_paths ke ggplot di atas dengan masing-masing memanggil koordinat berbeda dan menggambar garis di atas bilah yang diinginkan:

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

Hasilnya sebagai berikut:

masukkan deskripsi gambar di sini

Agak ceroboh karena saya tidak menginvestasikan terlalu banyak waktu untuk mendapatkan garis miring sempurna dan berjarak terpisah tetapi ini harus berfungsi sebagai bukti konsep.

Jelas bahwa garis dapat bersandar ke arah yang berlawanan dan ada juga ruang untuk meshing diagonal seperti meshing horizontal dan vertikal.

Saya pikir hanya itu yang bisa saya tawarkan di bagian depan pola. Semoga seseorang dapat menemukan kegunaannya.

EDIT 3: Kata-kata terakhir yang terkenal. Saya telah menemukan opsi pola lain. Kali ini menggunakan geom_jitter.

Sekali lagi saya menambahkan Variabel lain ke bingkai data:

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

Dan saya memesan bagaimana saya ingin setiap pola disajikan:

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

Selanjutnya saya membuat kolom yang berisi nomor yang terkait dengan bilah target yang dimaksudkan pada sumbu x:

Example.Data$Bubbles <- 2

Diikuti oleh kolom untuk memuat posisi pada sumbu y dari 'gelembung':

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)

Akhirnya saya menambahkan geom_jitters ke ggplot di atas menggunakan kolom baru untuk memposisikan dan menggunakan kembali 'Poin' untuk memvariasikan ukuran 'gelembung':

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

Setiap kali plot dijalankan, jitter memposisikan 'gelembung' secara berbeda tetapi berikut adalah salah satu output yang lebih baik yang saya miliki:

masukkan deskripsi gambar di sini

Terkadang 'gelembung' akan bergoyang di luar perbatasan. Jika ini terjadi, jalankan kembali atau cukup ekspor dalam dimensi yang lebih besar. Lebih banyak gelembung dapat diplot pada setiap kenaikan pada sumbu y yang akan mengisi lebih banyak ruang kosong jika Anda menginginkannya.

Itu membuat hingga 7 pola (jika Anda menyertakan garis miring diagonal berlawanan dan mesh diagonal keduanya) yang dapat diretas di ggplot.

Silakan menyarankan lebih banyak jika ada yang bisa memikirkan beberapa.

EDIT 4: Saya telah mengerjakan fungsi pembungkus untuk mengotomatiskan penetasan / pola di ggplot2. Saya akan memposting tautan setelah saya memperluas fungsi untuk memungkinkan pola di plot facet_grid dll. Berikut adalah output dengan input fungsi untuk plot batang sederhana sebagai contoh:

masukkan deskripsi gambar di sini

Saya akan menambahkan satu edit terakhir setelah saya memiliki fungsi yang siap untuk dibagikan.

EDIT 5: Berikut link ke fungsi EggHatch yang saya tulis untuk membuat proses penambahan pola ke plot geom_bar sedikit lebih mudah.

Docconcoct
sumber
Kerja bagus! Namun, tampaknya solusi ini hanya berfungsi untuk plot batang atau?
SkyWalker
@Giovanni Azua Saya hanya mencobanya untuk bar-plot ya. Ketika saya menemukan waktu, saya akan mencoba dan menyesuaikan fungsi tertaut untuk plot bertumpuk dll.
Docconcoct
70

Saat ini tidak memungkinkan karena kisi (sistem grafik yang digunakan ggplot2 untuk melakukan gambar sebenarnya) tidak mendukung tekstur. Maaf!

hadley
sumber
70
Adakah rencana untuk menambahkan gridextra sebagai dependensi untuk mendapatkan fungsi ini?
russellpierce
Ada berita tentang ini?
Hrant
Ini mungkin berubah dalam waktu tidak lama lagi. Lihat diskusi ini , bangunan atas perubahan yang akan datang ke paket jaringan R .
stragu
21

Anda dapat menggunakan paket ggtextures oleh @claus wilke untuk menggambar persegi panjang dan batang bertekstur dengan 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)

masukkan deskripsi gambar di sini

Anda juga dapat menggabungkannya dengan geom lain:

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

masukkan deskripsi gambar di sini

PoGibas
sumber
2
Terima kasih telah memindahkan jawaban Anda @PoGibas. Saya yakin ini akan mendapatkan lebih banyak perhatian (yang memang layak) di sini! Cheers
Henrik
Solusi yang sangat bagus.
Docconcoct
4
Lihat pola yang dapat diunduh di sini: heropatterns.com
Nova
Sekarang saya hanya perlu mencari tahu cara mengubah transparansi mereka di R .. haha
Nova
2

Saya pikir Docconcoct berfungsi dengan baik tetapi sekarang saya tiba-tiba mencari paket khusus di Google --- Patternplot . Tidak melihat kode internal tetapi vinyet tampaknya berguna.

UlvHare
sumber
2

Saya baru saja menemukan sebuah paket bernama ggpattern( https://github.com/coolbutuseless/ggpattern ) yang tampaknya menjadi solusi yang bagus untuk masalah ini dan terintegrasi dengan baik dengan alur kerja ggplot2. Meskipun solusi yang menggunakan tekstur mungkin berfungsi dengan baik untuk batang diagonal, solusi tersebut tidak akan menghasilkan grafik vektor dan oleh karena itu tidak optimal.

Berikut adalah contoh yang diambil langsung dari repositori 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)

yang menghasilkan plot ini:

plot contoh ggpattern

Jika hanya beberapa batang yang harus diberi garis, geom_col_pattern()memiliki pattern_alphaargumen yang dapat digunakan untuk membuat garis yang tidak diinginkan benar-benar transparan.

fujiu
sumber
1

Mungkin berguna untuk membuat bingkai data dummy yang konturnya sesuai dengan "tekstur" dan kemudian menggunakan geom_contour. Inilah contoh saya:

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

Dan inilah hasilnya: plot berbayang dengan garis-garis

(garis harus dihaluskan)

Ondrej Vencalek
sumber