Legend box width not correct when using par

2020-06-16 08:42发布

问题:

I have the problem , that my legend is too large, my code:

par(mfrow=c(1,2))
hist(alvsloss,breaks = 100, freq=F,main="Histogramm,
 density curve (gaussian kernel) \n and fitted normal distribution of Allianz simple losses ",xlim=c(-0.15,0.15),xlab="loss",ylab="density",cex.axis=1.2,cex.lab=1.2)
lines(density(alvsloss), col="black", lwd=2)
curve(dnorm(x, mean = mean(alvsloss), sd = sd(alvsloss)), add=TRUE, col="black",lwd=2,lty="dotted")

legend(-0.155, 30, c("(Gaussian) Kernel density","fitted normal distribution"),lwd=2, cex=0.8, 
   col=c("black","black"), lty=1:2)


qqnorm(alvsloss,main="normal QQ Plot",cex.axis=1.2,cex.lab=1.2)
qqline(alvsloss)

This gives the following picture:

The problem is, that the legend on the left is too big, how can I control the width of the box? The box is way too large.

data can be found here: http://uploadeasy.net/upload/ocafq.rar

回答1:

The white space on the right of you legend tells me that you manually widened your plot window. Legends do not scale well when it comes to manual re-sizing.

The solution is opening a plot of the exact size you need before plotting. In Windows, this is done with windows(width=10, height=8). Units are in inches. The surrounding box should now be tighter with the text.

If this is still not satisfactory, you should try:

  1. Reducing the font size of the legend cex=0.7
  2. Removing the box around the legend bty = "n" and using \n to split your legend onto several lines
  3. You can put your legend even more on the left using "topleft" instead of coordinates

Here's how I would do it:

legend("topleft", 
 legend=c("(Gaussian)\nKernel\ndensity","Fitted\nnormal\ndistribution\n"),
 bty = "n",lwd=2, cex=0.7, col=c("black","black"), lty=1:2)