Удалите несколько текстовых меток из меток на графике ggplot

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

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

Ось X легко «переполнена». Я хотел бы удалить часть текста для отметок, но не все отметки.

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

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

library(ggplot2)
library(ggExtra)

#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_vlines

#Get the tick texts I want to show
myLevels<-levels(cut(NDS,breaks=seq(roundDownNDS, roundUpNDS, by = 0.3)))
lengthMyLevels<-length(myLevels)
myBreaks<-seq(1,lengthMyLevels,3)
chosenbreaks<-myLevels[myBreaks[1]]
for(i in 2:length(myBreaks))
 {
 chosenbreaks<-rbind(chosenbreaks,myLevels[myBreaks[i]])
 }


#Generate the plot of both NDS & DS
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,size=8))  + opts(legend.position = "none")    + xlab("Scoreinterval") + ylab("Antal pr. interval") + geom_vline(aes(xintercept = minDS_bar, colour="red")) + geom_vline(aes(xintercept = maxDS_bar, colour="red")) + scale_x_discrete("test",breaks=chosenbreaks)

#Generate second dataframe for the plot of DS only
DSdataframe2<-cbind(na.omit(as.data.frame(DS_CUT)),rep(factor("Fallit"),length    (na.omit(as.data.frame(DS_CUT)))))
colnames(DSdataframe2)<-c("theScore","theAction")

#Calculate max value for the DS
myMax<-max(table(DSdataframe2))+1

attach(DSdataframe2)

#Generate plot for the 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")

#Using the ggExtra package the to plots are aligned
align.plots(fullplot, subplot)

detach(DSdataframe2)
detach(fulldataframe)

Любая помощь очень ценится!

Спасибо,

Christian

7 голосов | спросил Christian Bøhlke 23 MarpmWed, 23 Mar 2011 18:11:02 +03002011-03-23T18:11:02+03:0006 2011, 18:11:02

2 ответа


0

Если я правильно понимаю, вы можете просто указать пустые текстовые метки для каждой другой метки,

library(ggplot2)

interleave <- function(x,y){
  lx <- length(x)
  ly <- length(y)
  n <- max(lx,ly)
  as.vector(rbind(rep(x, length.out=n), rep(y, length.out=n)))
}

d <- data.frame(x=1:10, y=rnorm(10))

my_breaks <- seq(1,10,by=1)
my_labs <- interleave(seq(1,10,by=2), "")

qplot(x,y,data=d)+
  scale_x_continuous(breaks=my_breaks, labels=my_labs)

 введите описание изображения здесь

ответил baptiste 24 MaramThu, 24 Mar 2011 11:40:08 +03002011-03-24T11:40:08+03:0011 2011, 11:40:08
0

Вот еще одна версия, основанная на @baptiste, которая позволяет легко выбирать четное или нечетное, каждое третье и т. д.

 library(ggplot2)
library(gridExtra)

## helper function
## periodically replace orig with .fill
label_fill <- function(orig, .offset=0, .mod=2, .fill=""){
    ## replace
    ii <- as.logical(
        ## offset==0 keeps first
        (1:length(orig)-1+.offset) %% .mod
    )
    orig[ii] <- .fill
    orig
}

## data, labels
nn <- 10
my_dat <- data.frame(x=1:nn, y=rnorm(nn))
my_breaks <- my_dat$x

my_plot <- (
    ggplot(my_dat, aes(x,y))
    + geom_line()
    ## default: every other, start from 1
    ## by default, function takes breaks
    + scale_x_continuous(
        breaks=my_breaks, labels=label_fill
    )
    + theme_bw()
)

## another form 
## manually pass breaks
every_third <- scale_x_continuous(
    breaks=my_breaks, 
    labels=label_fill(my_breaks, .mod=3)
)

## side-by-side
grid.arrange(ncol=2,
    my_plot, 
    ## every third with offset
    my_plot + every_third
)

 введите описание изображения здесь

ответил helmingstay 4 FebruaryEurope/MoscowbSat, 04 Feb 2017 11:42:32 +0300000000amSat, 04 Feb 2017 11:42:32 +030017 2017, 11:42:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132