Добавьте вертикальные линии на гистограмму ggplot2 - PullRequest
1 голос
/ 22 марта 2011

Я провожу исследование недефолтеров и неплательщиков в отношении банковского дела. В этом контексте я строю их распределение относительно некоторой оценки на гистограмме. Чем выше оценка, тем лучше кредитный рейтинг.

Поскольку количество значений по умолчанию очень ограничено по сравнению с количеством не-значений по умолчанию, нанесение значений по умолчанию и значений по умолчанию на одном и том же гистограмме не очень хорошо, поскольку вы вряд ли сможете увидеть значения по умолчанию. Затем я строю вторую гистограмму, основываясь только на оценках неплательщиков, но на той же шкале интервалов, что и полная гистограмма как оценок неплательщиков, так и неплательщиков. Затем я хотел бы добавить вертикальные линии к первому столбчатому графику, указывающему, где находится самая высокая оценка неплательщика и самая низкая оценка неплательщика. Это означает, что распределение неплательщиков вписывается в общее распределение неплательщиков и неплательщиков.

Ниже код, который я использую, заменен случайными данными (засеянными).

library(ggplot2)

#NDS represents non-defaults and DS defaults on the same scale
#although here being just some random normals for the sake of simplicity.
set.seed(10)
NDS<-rnorm(10000,sd=1)-2
DS<-rnorm(100,sd=2)-5

#Cutoffs are constructed such that intervals of size 0.3 
#contain all values of NDS & DS
minCutoff<--9.3
maxCutoff<-2.1

#Generate the actual interval "bins"
NDS_CUT<-cut(NDS,breaks=seq(minCutoff, maxCutoff, by = 0.3))
DS_CUT<-cut(DS,breaks=seq(minCutoff, maxCutoff, by = 0.3))

#Manually generate where to put the vertical lines for min(DS) and max(DS)
minDS_bar<-levels(cut(NDS,breaks=seq(minCutoff, maxCutoff, by = 0.3)))[1]
maxDS_bar<-levels(cut(NDS,breaks=seq(minCutoff, maxCutoff, by = 0.3)))[32]

#Generate data frame - seems stupid, but makes sense
#when the "real" data is used :-)
NDSdataframe<-cbind(as.data.frame(NDS_CUT),rep(factor("State-1"),length(NDS_CUT)))
colnames(NDSdataframe)<-c("Score","Action")
DSdataframe<-cbind(as.data.frame(DS_CUT),rep(factor("State-2"),length(DS_CUT)))
colnames(DSdataframe)<-c("Score","Action")
fulldataframe<-rbind(NDSdataframe,DSdataframe)
attach(fulldataframe)

#Plot the full distribution of NDS & DS
# with geom_vline(xintercept = minDS_bar) + geom_vline(xintercept = maxDS_bar)
# that unfortunately does not show :-(
fullplot<-ggplot(fulldataframe, aes(Score, fill=factor(Action,levels=c("State-2","State-1")))) +     geom_bar(position="stack") + opts(axis.text.x = theme_text(angle = 45))  + opts    (legend.position = "none")    + xlab("Scoreinterval") + ylab("Antal pr. interval") + geom_vline(xintercept = minDS_bar) + geom_vline(xintercept = maxDS_bar) 

#Generate dataframe for DS only
#It might seem stupid, but again makes sense
#when using the original data :-)
DSdataframe2<-cbind(as.data.frame(DS_CUT),rep(factor("State-2"),length(DS_CUT)))
colnames(DSdataframe2)<-c("theScore","theAction")

#Calucate max number of observations to adjust bar plot of DS only
myMax<-max(table(DSdataframe2))+1
attach(DSdataframe2)

#Generate bar plot of DS only
subplot<-ggplot(fulldataframe, aes(theScore, fill=factor(theAction))) + geom_bar        (position="stack") + opts(axis.text.x = theme_text(angle = 45))  + opts(legend.position = "none") +     ylim(0, myMax) + xlab("Scoreinterval") + ylab("Antal pr. interval")

#plot on a grid
grid.newpage()
pushViewport(viewport(layout = grid.layout(2, 1)))
vplayout <- function(x, y)
viewport(layout.pos.row = x, layout.pos.col = y)
print(fullplot, vp = vplayout(1, 1))
print(subplot, vp = vplayout(2, 1))

#detach dataframes
detach(DSdataframe2)
detach(fulldataframe)

Кроме того, если у кого-то есть представление о том, как я могу выровнять график так, чтобы правильные интервалы были чуть ниже / выше друг друга на графике сетки

Надеюсь, кто-нибудь сможет помочь!

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

Christian

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Обтекание aes вокруг xintercept в слое geom_vline:

... + geom_vline(aes(xintercept = minDS_bar)) + geom_vline(aes(xintercept = maxDS_bar)) 
1 голос
/ 22 марта 2011

Вопрос 1:

Поскольку вы предоставляете вертикальные линии в качестве данных, вы должны сначала отобразить эстетику, используя aes ()

fullplot <-ggplot(
        fulldataframe, 
        aes(Score, fill=factor(Action,levels=c("State-2","State-1")))) +     
        geom_bar(position="stack") + 
        opts(axis.text.x = theme_text(angle = 45))  + 
        opts    (legend.position = "none")    + 
        xlab("Scoreinterval") + 
        ylab("Antal pr. interval") + 
        geom_vline(aes(xintercept = minDS_bar)) + 
        geom_vline(aes(xintercept = maxDS_bar)) 

Второй вопрос:

Для выравнивания графиков вы можете использовать функцию align.plots () в пакете ggExtra

install.packages("dichromat")
install.packages("ggExtra", repos="http://R-Forge.R-project.org")
library(ggExtra)

ggExtra::align.plots(fullplot, subplot)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...