2013-09-08 3 views
11

Я пытаюсь создать сложный график, но я не могу позиционировать легенду, чтобы она не перекрывала ни один из баров. Я попытался настроить поля, установив xlim, используя отдельное заявление legend и поиск здесь, все без успеха. Действительно, код для набора данных примера был получен из StackOverflow. Я использую базу R и предпочитаю базовое решение R. Спасибо за любой совет.Положения о расположении штабелированного штрихового графика

setwd('c:/users/mmiller21/simple R programs/') 

jpeg(filename = "barplot.jpeg") 

set.seed(1234) 
x <- replicate(8, round(10 * rexp(2000, 10))) 
y <- apply(x, 2, function(column) table(factor(column, levels = 0:9))) 
colnames(y) <- paste('A', seq(1,ncol(y),1), sep='') 
rownames(y) <- paste('R', seq(1,nrow(y),1), sep='') 
y 

#  A1 A2 A3 A4 A5 A6 A7 A8 
# R1 769 800 790 806 792 787 834 801 
# R2 779 733 793 757 786 744 731 776 
# R3 284 297 278 272 263 301 280 275 
# R4 112 106 91 124 106 103 104 96 
# R5 33 38 37 26 36 37 30 36 
# R6 11 18 7 11 10 20 11 9 
# R7 8 8 3 2 3 3 9 5 
# R8 4 0 1 2 4 4 0 2 
# R9 0 0 0 0 0 1 1 0 
# R10 0 0 0 0 0 0 0 0 

par(mfrow=c(1, 1), mar=c(5, 5, 4, 2) + 0.1) 
barplot(y, col = 1:nrow(y), ylab="My Variables", legend.text = TRUE, 
     args.legend = list(x = "topright", bty = "n")) 

dev.off() 

enter image description here

ответ

11

Как об этом:

library(RColorBrewer) 

barplot(
    y, 
    xlim=c(0, ncol(y) + 3), 
    col=brewer.pal(nrow(y), "Paired"), 
    ylab="My Variables", 
    legend.text=TRUE, 
    args.legend=list(
     x=ncol(y) + 3, 
     y=max(colSums(y)), 
     bty = "n" 
    ) 
) 

enter image description here

6

С полями

par(mfrow=c(1, 1), mar=c(5, 5, 4, 8)) 
barplot(y, col = 1:nrow(y), ylab="My Variables", legend.text = TRUE, 
     args.legend = list(x = "topright", bty = "n", inset=c(-0.15, 0))) 
+0

Спасибо. На моем компьютере легенда по-прежнему перекрывает одну из барин, используя ваш код, но не, если я использую ваш код с параметром par (mfrow = c (1, 1), mar = c (5, 5, 4, 4)). –

+0

@MarkMiller: потому что правый край имеет значение, когда у вас есть легенда справа. –

5

Просто для удовольствия, здесь в ggplot2, без перекрывающейся легенды.

set.seed(1234) 
x <- replicate(8, round(10 * rexp(2000, 10))) 
y <- apply(x, 2, function(column) table(factor(column, levels = 0:9))) 
y <- as.data.frame(y) 
colnames(y) <- paste('A', seq(1,ncol(y),1), sep='') 
rownames(y) <- paste('R', seq(1,nrow(y),1), sep='') 

library(ggplot2) 
library(reshape) 
y$ID <- rownames(y) 
y.melt <- melt(y, id.var = 'ID') 

y.melt <- within(y.melt, ID <- factor(ID, 
    c('R10','R9','R8','R7','R6','R5','R4','R3','R2','R1'), 
    ordered = TRUE)) 

ggplot(y.melt, aes(x = variable, y = value, fill = ID)) + 
    geom_bar(stat = 'identity') + 
    xlab("") + 
    ylab("My variable") + 
    theme(legend.title=element_blank()) 

bar chart

0

Вы должны добавить xpd=TRUE в par()

par(mfrow=.., mar=...,xpd=TRUE)