2016-06-06 2 views
1

Ich möchte ein Bild zwischen zwei Plots auf einem Gerät plotten. Wichtig ist, dass das Bild genau im Zentrum liegen muss und somit beide Plots überlappen. Bitte sehen Sie das Beispiel, wo ich die R logo als Bild verwendet:par (xpd = NA) funktioniert nicht, wenn Achsen = F in R plot

# png and grid are both for plotting the image 
library("png") 
library("grid") 
Rlogo <- readPNG("Rlogo.png") 

par(mfrow=c(1,2), xpd=NA) # two columns, xpd should permit plotting outside of margin 
barplot(-(1:10), horiz=T, border=NA, axes=FALSE) 
grid.draw(rasterGrob(Rlogo, x=unit(0.5, "npc"), y = unit(0.5, "npc"), width=unit(0.1, "npc"), height=unit(0.1, "npc"))) 
barplot(1:10, horiz=T, border=NA, axes=F) 

Ergebnisse in einem Schnitt R-Logo:

R logo gets cut

das Aussehen beibehalten, dh ohne Achsen, ist eine Behelfslösung ein hinzufügen Achse mit col = "white":

par(mfrow=c(1,2), xpd=NA) 
barplot(-(1:10), horiz=T, border=NA, axes=FALSE) 
axis(1, labels=F, col = "white") 
# axis(1, labels=F, tick=F) # does not help 
grid.draw(rasterGrob(Rlogo, x=unit(0.5, "npc"), y = unit(0.5, "npc"), width=unit(0.1, "npc"), height=unit(0.1, "npc"))) 
barplot(1:10, horiz=T, border=NA, axes=F) 

, die zurückgibt, was ich will

plot with logo

aber scheint nicht wie eine gute Lösung für mich.

Warum ist das Logo in der ersten Handlung geschnitten? Was haben Achsen mit Margen/Größe von Gerät/XPD zu tun?

Haben Sie andere Ideen oder Lösungen, wie Sie das Logo (ungeschnitten) in der Mitte ohne Achsen in den Plots erreichen können?

+0

Nicht viel. Das Logo wird immer noch geschnitten und durch Hinzufügen einer "weißen" Achse zum zweiten Barplot wird es gelöst. – jmjr

Antwort

2

Es scheint wahrscheinlich, dass die "traditionellen und Grid-Grafiken kämpfen für die Kontrolle der Clipping-Region" aus einer list email from Paul Murrell. Er schlägt vor, den Befehl grid.clip() vor dem Befehl grid wie folgt hinzuzufügen. Die xpd wird nicht mehr benötigt.

library("png") 
library("grid") 
Rlogo <- readPNG("Rlogo.png") 

par(mfrow=c(1,2)) 
barplot(-(1:10), horiz=T, border=NA, axes=FALSE,) 
grid.clip() 
grid.draw(rasterGrob(Rlogo, x=unit(0.5, "npc"), y = unit(0.5, "npc"), 
      width=unit(0.1, "npc"), height=unit(0.1, "npc"))) 
barplot(1:10, horiz=T, border=FALSE, axes=F) 

Ich kann nicht wirklich erklären, wie das Hinzufügen der Achse das Verhalten ändert.

enter image description here

0

Ich schlage vor, meinen Liebling klassische Methode (ohne Gitter).

library("png") 
Rlogo <- readPNG("Rlogo.png") 

par(mfrow=c(1,2), mar=c(2,2,2,2)) 
barplot(-(1:10), horiz=T, border=NA, axes=FALSE) 
barplot(1:10, horiz=T, border=NA, axes=F) 

par(mfrow=c(1,1), new=T, mar=c(2,2,2,2)) 
plot(0,0, type="n", axes=F, ann=F, asp=1) # flat mar and asp=1 are important to keep size ratio. 
a <- 0.3         # now the center is c(0, 0) 
rasterImage(Rlogo, - a/2, - a * 7/8/2 , a/2, a * 7/8 /2) # R logo is 800 x 700 
        # xleft,  ybottom,  xright,  ytop 

plot