2016-05-30 12 views
-2

Ich möchte Daten anzeigen, die ähnlich wie bei einem Likert-Diagramm, aber mit einer sekundären Achse paarweise vorkommen. Ich habe dieses Diagramm gefunden, das genau so aussieht, wie ich es möchte.R Likert-Diagramm mit sekundärer Achse

Example Graph

Wer weiß, wie man s.th. erstellen ähnlich oder hat ein Beispiel, wie man eine sekundäre Achse zu einem Likert-Diagramm oder irgendeine Idee hinzufügt, wie man ähnliche Daten auf eine kluge Weise darstellt?

+0

Welche Zeilen Code haben Sie versucht, auf welchem ​​Beispiel Daten? Ich meine, es gibt viele Beispiele auf Stackoverflow, wie man Diagramme mit zwei Achsen erstellt (obwohl viele darüber nachdenken, dass es eine schlechte Übung ist). IMHO einige Dinge sind schneller in Excel gemacht; diese Diagramme sind einer von ihnen. – lukeA

+0

Dies ist eine Tabelle, die ich bei Google gefunden habe (keine Quelle, wie das gemacht wurde), der nächste, den ich bisher gefunden habe, war der Likert, aber sie haben nur eine x-Achse. Ich werde verschiedene Kategorien von Daten mit jeweils zwei Datenpunkten haben, wie in der obigen Tabelle. – ThatQuantDude

+0

Apropos Google: https://www.google.com/?q=site%3Astackoverflow.com+r+Barchart+zwei+Achsen. Ich schlage vor, dass Sie diese Antworten durchlesen + [Wie ein minimales reproduzierbares Beispiel in R bereitgestellt wird] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example#answer- 5963610). Dann bearbeite und verbessere deine Frage entsprechend. Das heißt, Eingabedaten bereitstellen (z. B. das Ergebnis von dput (mydata) hinzufügen), welche Codezeilen Sie ausprobiert haben und auf welche Weise das Ergebnis nicht zufriedenstellend ist. – lukeA

Antwort

1

Ich genieße zu versuchen, diese Arten von Plots von primitiven Grafikelementen und manuellen Koordinatenberechnungen zu erstellen. Es gibt Ihnen die vollständige Kontrolle über alle Aspekte der Handlung, auf Kosten einer beträchtlichen Menge an Komplexität und Kompliziertheit im Plotcode.

Hier gehen Sie:

plot

## generate data 
df <- data.frame(region=rep(c('OECD','Non-OECD Europe and Eurasia','China','Bunkers','Asia','Non-OECD Americas','Africa','Middle East'),each=2L),year=c(1973L,2010L),emissions=c(68,41,17,9,7,23,5,4,4,12,3,4,2,3,1,7)); 
df; 
##       region year emissions 
## 1       OECD 1973  68 
## 2       OECD 2010  41 
## 3 Non-OECD Europe and Eurasia 1973  17 
## 4 Non-OECD Europe and Eurasia 2010   9 
## 5      China 1973   7 
## 6      China 2010  23 
## 7      Bunkers 1973   5 
## 8      Bunkers 2010   4 
## 9       Asia 1973   4 
## 10      Asia 2010  12 
## 11   Non-OECD Americas 1973   3 
## 12   Non-OECD Americas 2010   4 
## 13      Africa 1973   2 
## 14      Africa 2010   3 
## 15     Middle East 1973   1 
## 16     Middle East 2010   7 

## set configuration parameters 
xlim <- c(0,1); 
ylim <- c(0,1); 
ybararea.pct <- 86; 
ybargap.ratio <- 2.2; ## bar/gap; really describes larger bars, i.e. 2010 bars to gaps 
ybar1973.pct <- 55; ## 1973 pct height of 2010 
x.range.1973 <- c(0,100); 
x.ticks.1973 <- seq(x.range.1973[1L],x.range.1973[2L],20); 
x.range.2010 <- c(0,51.5); 
x.ticks.2010 <- seq(x.range.2010[1L],x.range.2010[2L],10); 
y.wrap <- 16; 
col.1973 <- '#3377BB'; 
col.2010 <- '#BBCCEE'; 
col.axis <- '#888888'; 
legend.x <- 0.77; 
legend.y <- 0.2; 
legend.overlap <- 0.01; 
legend.spread <- 0.033; 

## precompute derived parameters 
h <- (1-ybararea.pct/100)/2*diff(ylim); ybararea.range <- c(ylim[1L]+h,ylim[2L]-h); 
regions <- unique(df$region); 
NB <- length(regions); 
ybar.height.max <- diff(ybararea.range)/(NB + (NB-1L)/ybargap.ratio); ## this formula can be derived 
ybar.height.2010 <- ybar.height.max; 
ybar.height.1973 <- ybar.height.2010*ybar1973.pct/100; 
ybar.centers <- rev(seq(ybararea.range[1L]+ybar.height.max/2,ybararea.range[2L]-ybar.height.max/2,len=NB)); 

## helper function 
xscale <- function(x,r,xlim=c(0,1)) xlim[1L]+(x-r[1L])/diff(r)*diff(xlim); 

## plot 
par(mar=c(5,7,4,2)+0.1); 
plot(NA,xlim=xlim,ylim=ylim,xaxs='i',yaxs='i',axes=F,ann=F); 
## bars 
with(df[df$year==2010L,],rect(xscale(0,x.range.2010),ybar.centers-ybar.height.2010/2,xscale(emissions,x.range.2010),ybar.centers+ybar.height.2010/2,col=col.2010,border=NA)); 
with(df[df$year==1973L,],rect(xscale(0,x.range.1973),ybar.centers-ybar.height.1973/2,xscale(emissions,x.range.1973),ybar.centers+ybar.height.1973/2,col=col.1973,border=NA)); 
## x-axes 
segments(xlim[1L],ylim[1L],xlim[2L],col=col.axis); 
axis(3L,xscale(x.ticks.1973,x.range.1973),x.ticks.1973,col=col.axis,padj=0.8); 
mtext(expression(paste('Percentage of total ',CO[2],' emissions for 1973')),3L,1.75); 
segments(xlim[1L],ylim[2L],xlim[2L],col=col.axis); 
axis(1L,xscale(x.ticks.2010,x.range.2010),x.ticks.2010,col=col.axis,padj=-0.8); 
mtext(expression(paste('Percentage of total ',CO[2],' emissions for 2010')),1L,1.75); 
## y-axis 
mtext(lapply(regions,function(x) paste(collapse='\n',strwrap(x,y.wrap))),2L,0.3,las=2L,at=ybar.centers); 
## legend 
rect(legend.x-legend.overlap,legend.y-ybar.height.2010/2,legend.x+legend.spread,legend.y+ybar.height.2010/2,col=col.2010,border=NA); 
rect(legend.x-legend.spread,legend.y-ybar.height.1973/2,legend.x+legend.overlap,legend.y+ybar.height.1973/2,col=col.1973,border=NA); 
text(legend.x-legend.spread,legend.y,'1973',pos=2L,offset=0.1); 
text(legend.x+legend.spread,legend.y,'2010',pos=4L,offset=0.1); 

Referenzen

+0

genial danke Ich werde den Code durchgehen und versuchen, es vollständig zu verstehen – ThatQuantDude