2013-02-21 2 views
2

Проблема решает! Всем спасибо! (решение внизу этого сообщения)ggplot: значения оси y (разрывы) из уложенной пропорциональной гистограммы?

Мне нравится создавать штабелированную пропорциональную гистограмму с ggplot. Моя проблема - это разрывы оси y, которые, как представляется, относятся к процентному значению каждой плитки, но не находятся в пределах от 0 до 100, как ожидалось.

Вот мой кадр данных:

fg grp prc 
1 1 g1 85.23 
2 2 g1 14.77 
3 1 g2 73.33 
4 2 g2 26.67 
5 1 g3 85.53 
6 2 g3 14.47 
7 1 g4 87.18 
8 2 g4 12.82 
9 1 g5 72.22 
10 2 g5 27.78 

Это, как я вызываю функцию участка:

require(ggplot2) 
ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
    geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
    scale_fill_manual(values=c("#235a80", "#80acc8")) + 
    labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
    theme(axis.line = element_line(colour="gray"), 
     axis.text = element_text(size=rel(1.3)), 
     axis.title = element_text(face="italic", size=rel(1.4))) 

И, наконец, это мой результат:

enter image description here

Как вы можете видеть, что оси Y-оси соответствуют процентным значениям prc-va riable.

Я хотел бы иметь диапазон у-оси от 0 до 100, с разрывами на каждой 10-й позиции (seq(0,100,by=10)). Нужно ли мне каким-либо образом подготовить мои данные? Как мне «исправить» ось y?

Заранее спасибо

Это способ, как рассчитать данные и рабочее решение!

clusterDiskriminanz <- function(myData, groups, gcnt) { 
    disc <- lda(groups ~ ., data=myData, na.action="na.omit", CV=TRUE) 
    ct <- table(groups, disc$class) 
    dg <- diag(prop.table(ct, 1)) 
    # print barplot for correct percentage for each category of groups 

    newdat <- NULL 
    tmpdat <- NULL 
    filldat <- NULL 

    perc <- round(100*dg,2) 
    percrest <- round(100-perc,2) 

    # looks strange, but for testing purposes 
    # I add data this way. Perhaps I also lack 
    # a bit of functions which may do this better and faster 
    for (i in 1:gcnt) { 
    newdat <- rbind(newdat, c(paste("g",i,sep=""))) 
    newdat <- rbind(newdat, c(paste("g",i,sep=""))) 
    tmpdat <- rbind(tmpdat, perc[i]) 
    tmpdat <- rbind(tmpdat, percrest[i]) 
    filldat <- rbind(filldat, "1") 
    filldat <- rbind(filldat, "2") 
    } 

    # create data frame! prc-values are treated as numeric 
    # now! need to convert $g to factors though! 
    mydat <- data.frame(filldat, newdat, tmpdat) 
    names(mydat) <- c("fg", "grp", "prc") 
    mydat$fg <- factor(mydat$fg) 

    # ggplot-stuff comes here... 
    require(ggplot2) 
    ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
    geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
    scale_fill_manual(values=c("#235a80", "#80acc8")) + 
    labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
    geom_hline(yintercept=totalcorrect, linetype=2, colour="white", alpha=0.8) + 
    # Achsenbeschriftung etwas größer machen 
    theme(axis.line = element_line(colour="gray"), 
      axis.text = element_text(size=rel(1.3)), 
      axis.title = element_text(face="italic", size=rel(1.4))) + 
    scale_y_continuous(breaks = seq(0, 100, 10)) + 
    coord_cartesian(ylim=c(0,100)) 
    } 
+0

Я полагаю, что переменная PRC рассматривается как фактор (только таким образом я могу получить масштаб y так же, как ваш). Попробуйте str (mydat), чтобы увидеть тип всех столбцов. Я бы предложил удалить из вашей функциональной строки newdat <-cbind (filldat, newdat, tmpdat) и использовать mydat <-data.frame (filldat, newdat, tmpdat) –

+0

Спасибо большое, теперь я получил его! Команда str помогла показать мне недостающую информацию. Действительно, $ prc рассматривался как фактор и просто использовал mydat <-data.frame (filldat, newdat, tmpdat) и преобразовывал $ fg в обработанные факторы. – Daniel

ответ

3

Вы можете использовать coord_cartesian(ylim=c(0,100)) указать limits для выполнения визуального увеличения из данные (которые затем остаются неизменными). Вы также можете добавить его к scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10))), но установка пределов на шкале будет использовать только данные, находящиеся внутри этих пределов, поэтому подмножество исходных данных. В вашем примере он вернет тот же сюжет, но может существенно изменить график (например, boxplot).

dataset<- textConnection("fg grp prc 
1 g1 85.23 
2 g1 14.77 
1 g2 73.33 
2 g2 26.67 
1 g3 85.53 
2 g3 14.47 
1 g4 87.18 
2 g4 12.82 
1 g5 72.22 
2 g5 27.78") 

mydat<- read.table(dataset,header=TRUE) 
mydat$fg <- as.factor(mydat$fg) 

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
scale_fill_manual(values=c("#235a80", "#80acc8")) + 
labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
theme(axis.line = element_line(colour="gray"), 
axis.text = element_text(size=rel(1.3)), 
axis.title = element_text(face="italic", size=rel(1.4))) + coord_cartesian(ylim=c(0,100))+ scale_y_continuous(breaks=(seq(0,100,by=10))) 

EDIT в связи с комментарием:

Это не работает:

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
scale_fill_manual(values=c("#235a80", "#80acc8")) + 
labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
theme(axis.line = element_line(colour="gray"), 
    axis.text = element_text(size=rel(1.3)), 
    axis.title = element_text(face="italic", size=rel(1.4)))+scale_y_continuous(breaks = seq(0, 100, 10)) 
+coord_cartesian(ylim=c(0,100)) 

Это делает:

ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
scale_fill_manual(values=c("#235a80", "#80acc8")) + 
labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
theme(axis.line = element_line(colour="gray"), 
    axis.text = element_text(size=rel(1.3)), 
    axis.title = element_text(face="italic", size=rel(1.4)))+scale_y_continuous(breaks = seq(0, 100, 10)) + 
coord_cartesian(ylim=c(0,100)) 
+0

Спасибо! Этот подход частично работает - но только, если я читаю данные с помощью функции textConnection. Где разница с моим исходным фреймом данных? Являются ли значения в моем кадре данных неправильным форматом или кодированием? Запуск кода в моем кадре данных приводит к: «Fehler in + coord_cartesian (ylim = c (0, 100)): ungültiges Argument für unären Operator». Но он работает, когда я использую фрейм данных, созданный textConnection/read.table. – Daniel

+0

вы должны добавить + coord_cartesian (ylim = c (0, 100)) в правильном направлении. Где знак «+» в вашем коде? В конце превалирующей линии или в начале следующей строки? – JT85

+0

Если я добавляю только координатный параметр, получается следующий результат: http://temp.danielluedecke.de/Rplot2.png – Daniel

2

Вы можете задать разрывы с функцией scale_y_continuous (параметр breaks):

mydat <- as.data.frame(mydat) 
mydat$fg <- as.factor(mydat$fg) 

library(ggplot2) 
ggplot(mydat, aes(x=grp, y=prc, fill=fg)) + 
    geom_bar(stat="identity", colour="black", show_guide=FALSE) + 
    scale_fill_manual(values=c("#235a80", "#80acc8")) + 
    labs(title=NULL, x="Cluster-Gruppen", y=NULL) + 
    theme(axis.line = element_line(colour="gray"), 
     axis.text = element_text(size=rel(1.3)), 
     axis.title = element_text(face="italic", size=rel(1.4))) + 
    scale_y_continuous(breaks = seq(0, 100, 10))   # the new command 

enter image description here

+0

Привет Свен, спасибо за ваш быстрый ответ!Добавление команды scale не помогло, я уже пробовал. Это приводит к ошибке: «Дискретное значение, заданное для непрерывной шкалы». Но «преобразование» данных, предложенное JT85, похоже, устраняет проблему, и тогда команда масштабирования работает отлично! Но только, если я использую команду textConnection, а не если я применяю дополнительные команды к исходному фрейму данных. – Daniel

+1

@ DanielLüdecke Да, я преобразовал 'fg' в коэффициент, используя' mydat $ fg <- as.factor (mydat $ fg) '. Без этого преобразования я получил такое же сообщение об ошибке. –

Смежные вопросы