2016-07-26 9 views
0

Hier ist ein Diagramm von Bremsweg vs. Geschwindigkeit, für die cars Daten, geglättet.geom_smooth bewegt sich basierend auf scale_y_continuous limits

ggplot(cars, aes(x=cars$speed,y=cars$dist)) + 
+ scale_x_continuous(expand = c(0, 0)) + 
+ scale_y_continuous(expand = c(0, 0), limits=c(-20,125)) + geom_smooth() 

enter image description here

Beachten Sie, dass das graue Konfidenzintervall auf etwa 112,5 nach oben geht.

Nun nehme ich an, ich möchte etwas von dem unbenutzten Bereich am oberen Rand des Diagramms zuschneiden, indem ich die y-Achsen-Grenzen verändere.

ggplot(cars, aes(x=cars$speed,y=cars$dist)) + 
+ scale_x_continuous(expand = c(0, 0)) + 
+ scale_y_continuous(expand = c(0, 0), limits=c(-20,116)) + geom_smooth() 
Warning message: 
Removed 1 rows containing non-finite values (stat_smooth). 

Beachten Sie die Warnmeldung; Ich komme darauf zurück.

enter image description here

Sehen Sie, wie das graue Konfidenzintervall jetzt geht nur auf etwa 104 bis? Ich vermute, das ist, weil die geom_smooth Funktion einen der ursprünglichen Datenpunkte verworfen hat, weil es außerhalb des Bereichs liegt, und das die Glättungsberechnung geändert hat. (In der Tat ist einer der Bremsdistanzen 120.) Ich nehme an, dass das die Warnmeldung bedeutet.

Wie kann ich das umgehen? Der verschwendete Platz in der ursprünglichen Handlung ist kein großes Problem, aber mit meinen eigenen Daten hätte ich viel verschwendeten Raum. Muss ich die Glättungsformel separat berechnen und dann mit geom_ribbon und geom_line plotten?

Es gibt eine Option für geom_smooth, fullrange=TRUE, die Sie verwenden können, wenn Ihre X-Achsen-Grenzwerte nicht alle Daten enthalten. Aber das funktioniert hier nicht, und es gibt keine fulldomain=TRUE Option.


EDIT: Das Problem hier beschriebenen unterscheidet sich von dem in ggplot2: geom_smooth confidence band does not extend to edge of graph, even with fullrange=TRUE beschrieben (auch wenn die Lösung im wesentlichen die gleiche ist). Bei diesem Problem handelt es sich um das graue Konfidenzintervall abgeschnitten. Dieses Problem betrifft die Glättungslinie, und das Intervall wurde durch die Achsengrenzen geändert. Ich weiß nicht, dass jemand, der nach einer Lösung für dieses Problem sucht, wahrscheinlich erkennen würde, dass das andere Problem dieselbe Lösung hat; Es war nur zufällig, dass ich es tat.

+0

@beetroot Ich habe eine Erklärung hinzugefügt, warum dieses Problem anders ist. – mhwombat

+0

Ich sehe wirklich keinen Unterschied, der groß genug ist, um dies zu rechtfertigen. – beetroot

Antwort

3

Limits in Skalen() zuerst die Werte außerhalb die Grenzen für fehlende und berechnet dann die Geom.

Grenzen in coords() berechnet zunächst die Geome und zeichnet dann nur die Informationen innerhalb der Grenzen.

Für einige reproduzierbare Beispiele siehe http://rpubs.com/INBOstats/zoom_in.

2

fand ich die Lösung hier (obwohl das beschriebene Problem anders ist, die Lösung das gleiche ist): ggplot2: geom_smooth confidence band does not extend to edge of graph, even with fullrange=TRUE

Die Lösung ist coord_cartesian zu verwenden, um die y-Achse, statt scale_y_continuous(..., limits=...) zu beschränken. Wir können sogar den unsinnigen Teil beseitigen, der in negative Bremswege geht.

ggplot(cars, aes(x=cars$speed,y=cars$dist)) + 
    coord_cartesian(ylim=c(0,116)) + 
    scale_x_continuous(expand = c(0, 0)) + 
    scale_y_continuous(expand = c(0, 0)) + geom_smooth() 

enter image description here

Für weitere Informationen über die Differenz zwischen Skalen oder Koordinatensystemen unter Verwendung der Handlung Grenzen zu steuern, siehe http://docs.ggplot2.org/current/coord_cartesian.html