Comment ajouter une texture pour remplir les couleurs dans ggplot2

103

J'utilise actuellement scale_brewer()pour le remplissage et ceux-ci sont beaux en couleur (à l'écran et via une imprimante couleur) mais s'impriment de manière relativement uniforme en gris lorsque vous utilisez une imprimante noir et blanc. J'ai cherché dans la ggplot2documentation en ligne mais je n'ai rien vu sur l'ajout de textures pour remplir les couleurs. Existe-t-il un ggplot2moyen officiel de le faire ou est-ce que quelqu'un a un hack qu'il utilise? Par textures, j'entends des choses comme des barres diagonales, des barres diagonales inversées, des motifs de points, etc. qui différencieraient les couleurs de remplissage lorsqu'elles étaient imprimées en noir et blanc.

rhh
la source

Réponses:

35

ggplot peut utiliser des palettes de colorbrewer. Certains d'entre eux sont faciles à "photocopier". Alors mabe quelque chose comme ça fonctionnera pour vous?

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

dans ce cas, OrRd est une palette trouvée sur la page Web colorbrewer: http://colorbrewer2.org/

Photocopy Friendly: Ceci indique qu'une palette de couleurs donnée résistera à la photocopie en noir et blanc. Les schémas divergents ne peuvent pas être photocopiés avec succès. Les différences de luminosité doivent être préservées avec des schémas séquentiels.

Andreas
la source
23
Ne répond pas à la question du PO. Je suis venu ici parce que je suis collé à certaines couleurs. Cette «réponse» acceptée ne suggère pas comment appliquer les textures.
MS Berends
3
@MSBerends cela ne répond pas à votre question . À peu près sûr que la coche verte est un signe qu'il a répondu à la question!
Yan Foto
10
Ne vous laissez pas berner par une coche. La question était de savoir comment appliquer des textures - et cela reste sans réponse. Une idée hors des sentiers battus a été fournie, oui, mais pas une réponse à la question.
MS Berends
84

Salut les gens, voici un petit hack qui résout le problème de texture de manière très basique:

ggplot2: rendre la bordure d'une barre plus sombre que les autres en utilisant R

EDIT: J'ai enfin trouvé le temps de donner un bref exemple de ce hack qui permet au moins 3 types de motif de base dans ggplot2. Le code:

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

Produit ceci:

entrez la description de l'image ici

Ce n'est pas super joli mais c'est la seule solution à laquelle je puisse penser.

Comme on peut le voir, je produis des données très basiques. Pour obtenir les lignes verticales, je crée simplement un bloc de données contenant la variable à laquelle je voulais ajouter des lignes verticales et j'ai redessiné les bordures du graphique plusieurs fois en réduisant la largeur à chaque fois.

Une chose similaire est faite pour les lignes horizontales mais une nouvelle trame de données est nécessaire pour chaque redessiner où j'ai soustrait une valeur (dans mon exemple «5») de la valeur associée à la variable d'intérêt. Réduire efficacement la hauteur de la barre. Ceci est difficile à réaliser et il peut y avoir des approches plus rationalisées, mais cela illustre comment cela peut être réalisé.

Le motif de maillage est une combinaison des deux. Tout d' abord dessiner les lignes verticales, puis ajoutez les lignes horizontales de réglage fillque fill='transparent'pour assurer les lignes verticales ne sont pas tracées sur.

Jusqu'à ce qu'il y ait une mise à jour du modèle, j'espère que certains d'entre vous trouveront cela utile.

MODIFIER 2:

Des motifs diagonaux supplémentaires peuvent également être ajoutés. J'ai ajouté une variable supplémentaire à la trame de données:

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

Ensuite, j'ai créé un nouveau bloc de données pour contenir les coordonnées des lignes diagonales:

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

À partir de là, j'ai ajouté geom_paths au ggplot ci-dessus, chacun appelant des coordonnées différentes et dessinant les lignes sur la barre souhaitée:

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

Il en résulte ce qui suit:

entrez la description de l'image ici

C'est un peu bâclé car je n'ai pas investi trop de temps pour que les lignes soient parfaitement inclinées et espacées, mais cela devrait servir de preuve de concept.

Évidemment, les lignes peuvent s'incliner dans la direction opposée et il y a également de la place pour un maillage diagonal tout comme le maillage horizontal et vertical.

Je pense que c'est à peu près tout ce que je peux offrir sur le plan du motif. J'espère que quelqu'un pourra en trouver une utilité.

EDIT 3: derniers mots célèbres. J'ai proposé une autre option de modèle. Cette fois en utilisant geom_jitter.

Encore une fois, j'ai ajouté une autre variable à la trame de données:

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

Et j'ai ordonné comment je voulais que chaque modèle soit présenté:

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

Ensuite, j'ai créé une colonne pour contenir le numéro associé à la barre cible prévue sur l'axe des x:

Example.Data$Bubbles <- 2

Suivi de colonnes pour contenir les positions sur l'axe des y des `` bulles '':

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)

Enfin, j'ai ajouté geom_jitters au ggplot ci-dessus en utilisant les nouvelles colonnes pour le positionnement et la réutilisation de `` Points '' pour faire varier la taille des `` bulles '':

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

Chaque fois que le tracé est exécuté, la gigue positionne les `` bulles '' différemment, mais voici l'une des plus belles sorties que j'avais:

entrez la description de l'image ici

Parfois, les «bulles» tremblent à l'extérieur des frontières. Si cela se produit, relancez ou exportez simplement dans de plus grandes dimensions. Plus de bulles peuvent être tracées sur chaque incrément sur l'axe des y, ce qui remplira davantage l'espace vide si vous le souhaitez.

Cela fait jusqu'à 7 modèles (si vous incluez des lignes diagonales inclinées opposées et un maillage diagonal des deux) qui peuvent être piratés dans ggplot.

N'hésitez pas à en suggérer davantage si quelqu'un peut réfléchir à certains.

EDIT 4: J'ai travaillé sur une fonction wrapper pour automatiser les hachures / motifs dans ggplot2. Je publierai un lien une fois que j'ai développé la fonction pour autoriser les motifs dans les tracés facet_grid, etc. Voici une sortie avec l'entrée de fonction pour un simple tracé de barres à titre d'exemple:

entrez la description de l'image ici

J'ajouterai une dernière modification une fois que la fonction sera prête à être partagée.

EDIT 5: Voici un lien vers la fonction EggHatch que j'ai écrite pour faciliter un peu le processus d'ajout de motifs aux tracés geom_bar.

Docconcoct
la source
Bon travail! Cependant, il semble que cette solution ne fonctionne que pour les graphiques à barres ou?
SkyWalker
@Giovanni Azua Je ne l'ai essayé que pour les bar-plots oui. Quand je trouverai le temps, j'essaierai d'adapter la fonction liée pour les parcelles empilées etc.
Docconcoct
71

Ce n'est actuellement pas possible car grid (le système graphique utilisé par ggplot2 pour faire le dessin réel) ne prend pas en charge les textures. Désolé!

hadley
la source
70
Avez-vous l'intention d'ajouter gridextra en tant que dépendance afin d'obtenir cette fonctionnalité?
russellpierce
Des nouvelles à ce propos?
Hrant
Cela pourrait changer dans un avenir pas si lointain. Voir cette discussion , se fondant sur les changements à venir à l'ensemble du réseau de R .
stragu
22

Vous pouvez utiliser le package ggtextures de @claus wilke pour dessiner des rectangles et des barres texturés avec 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)

entrez la description de l'image ici

Vous pouvez également le combiner avec d'autres 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()

entrez la description de l'image ici

PoGibas
la source
2
Merci d'avoir déplacé votre réponse @PoGibas. Je parie que cela attirera beaucoup plus d'attention (bien méritée) ici! Cheers
Henrik
Très belle solution.
Docconcoct le
4
Découvrez les modèles téléchargeables ici: heropatterns.com
Nova
Maintenant, j'ai juste besoin de savoir comment modifier leur transparence dans R .. haha
Nova
3

Je viens de découvrir un package appelé ggpattern( https://github.com/coolbutuseless/ggpattern ) qui semble être une bonne solution à ce problème et s'intègre bien avec le flux de travail ggplot2. Bien que les solutions utilisant des textures puissent fonctionner correctement pour les barres diagonales, elles ne produiront pas de graphiques vectoriels et ne sont donc pas optimales.

Voici un exemple tiré directement du dépôt github de 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)

ce qui donne ce tracé:

Exemple de graphique ggpattern

Si seulement certaines barres doivent être rayées, geom_col_pattern()a un pattern_alphaargument qui pourrait être utilisé pour rendre certaines bandes indésirables complètement transparentes.

Fujiu
la source
2

Je pense que le travail de Docconcoct est excellent, mais maintenant, j'ai soudainement cherché sur Google un package spécial --- Patternplot . Je n'ai pas vu le code interne mais la vignette semble utile.

UlvHare
la source
1

Il peut être utile de créer un bloc de données factice dont les contours correspondent à des "textures" puis d'utiliser geom_contour. Voici mon exemple:

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

Et voici le résultat: tracé ombré avec des lignes

(les lignes doivent être lissées)

Ondrej Vencalek
la source