2013-03-13 1 views
13

enter image description hereDer einfachste Weg, Ungleichungen mit schraffierten Füllungen darzustellen?

Siehe die obige Grafik. Ich habe die Gleichungen in Excel gezeichnet und dann von Hand schattiert. Sie können sehen, dass es nicht sehr ordentlich ist. Sie können sehen, dass es sechs Zonen gibt, die jeweils durch zwei oder mehr Gleichungen begrenzt sind. Was ist der einfachste Weg, um Ungleichheiten zu zeichnen und die Regionen mit schraffierten Mustern zu schattieren?

+6

+1 für eine schöne handgezeichnete Bild !! Aber Sie können sich am Ende eines Downvotes von jemandem befinden, der weniger nachsichtig ist, weil Sie keinen Code, keine Beispieldaten oder * was Sie bereits versucht haben * gezeigt haben! –

+0

@ SimonO101 danke. Ich habe es in Excel und Matlab versucht. Matlab erfordert Mupad, die ich nicht habe.Außerdem denke ich ein Nein. von Software kann dies tun, obwohl der Schwierigkeitsgrad sehr unterschiedlich sein wird. Wenn jemand bestätigen kann, welche Software beim Berechnen von Ungleichheiten wirklich cool ist, kann ich mich darauf konzentrieren, diese Software im Detail zu lernen. –

+2

Dies kann verwandt sein: http://StackOverflow.com/Q/11345838 (auch in Verbindung damit, wenn Sie die schraffierten Regionen möchten: http://blogs.mathworks.com/pick/2011/07/15/creating- schraffierte Flecken /). Aber wie Sie in Ihrem Kommentar erwähnt haben, ist Matlab möglicherweise nicht das beste Werkzeug für diese Aufgabe. – Aabaz

Antwort

15

Zum Aufbau auf @ agstudy Antwort, hier ist eine schnelle und schmutzige Art und Weise, Ungleichheiten zu repräsentieren in R:

plot(NA,xlim=c(0,1),ylim=c(0,1), xaxs="i",yaxs="i") # Empty plot 
a <- curve(x^2, add = TRUE) # First curve 
b <- curve(2*x^2-0.2, add = TRUE) # Second curve 
names(a) <- c('xA','yA') 
names(b) <- c('xB','yB') 
with(as.list(c(b,a)),{ 
    id <- yB<=yA 
    # b<a area 
    polygon(x = c(xB[id], rev(xA[id])), 
      y = c(yB[id], rev(yA[id])), 
      density=10, angle=0, border=NULL) 
    # a>b area 
    polygon(x = c(xB[!id], rev(xA[!id])), 
      y = c(yB[!id], rev(yA[!id])), 
      density=10, angle=90, border=NULL) 
    }) 

enter image description here

Wenn das betreffende Gebiet wird von mehr als 2 STUFEN umgeben Ionen, fügen Sie einfach mehr Bedingungen:

plot(NA,xlim=c(0,1),ylim=c(0,1), xaxs="i",yaxs="i") # Empty plot 
a <- curve(x^2, add = TRUE) # First curve 
b <- curve(2*x^2-0.2, add = TRUE) # Second curve 
d <- curve(0.5*x^2+0.2, add = TRUE) # Third curve 

names(a) <- c('xA','yA') 
names(b) <- c('xB','yB') 
names(d) <- c('xD','yD') 

with(as.list(c(a,b,d)),{ 
    # Basically you have three conditions: 
    # curve a is below curve b, curve b is below curve d and curve d is above curve a 
    # assign to each curve coordinates the two conditions that concerns it. 

    idA <- yA<=yD & yA<=yB 
    idB <- yB>=yA & yB<=yD 
    idD <- yD<=yB & yD>=yA 
    polygon(x = c(xB[idB], xD[idD], rev(xA[idA])), 
      y = c(yB[idB], yD[idD], rev(yA[idA])), 
      density=10, angle=0, border=NULL) 
    }) 

enter image description here

+0

+1! Ich benutze nur ** mit **, um dein gutes Beispiel lesbar zu machen. Polygon ist nicht offensichtlich, also finde ich deinen Code nicht so schmutzig wie du sagst). – agstudy

+0

Was ist, wenn der Bereich von 3 oder 4 Gleichungen umgeben ist? –

+0

@AshniGoyal warum nicht Ihre Frage zu aktualisieren, um diese Gleichungen hinzuzufügen? Es ist besser, an einem konkreten Beispiel zu arbeiten. – agstudy

3

Es gibt mehrere submissions auf der zentralen File Exchange MATLAB, die ausgebrütet Plots auf verschiedene Arten für Sie produzieren.

9

In R gibt es nur eine begrenzte Unterstützung für Füllmuster und sie können nur auf Rechtecke angewendet werden und polygons.This ist und nur innerhalb der traditionellen Grafik, keine ggplot2 oder lattice.

Es ist möglich, ein Rechteck oder Polygon mit einer Reihe von Linien zu füllen, die in einem bestimmten Winkel gezeichnet wurden, mit einem bestimmten Abstand zwischen den Linien. A Dichte Argument steuert den Abstand zwischen den Zeilen (in Zeilen pro Zoll) und ein Winkel Argument steuert den Winkel der Linien.

hier ein Beispiel aus der Hilfe:

plot(c(1, 9), 1:2, type = "n") 
polygon(1:9, c(2,1,2,1,NA,2,1,2,1), 
     density = c(10, 20), angle = c(-45, 45)) 

enter image description here

EDIT

Eine weitere Option ist die Alpha-Blending zu verwenden, um zwischen Regionen zu unterscheiden. Hier @plannapus Beispiel und gridBase Paket mit Polygonen zu überlagern, können Sie etwas tun können:

library(gridBase) 
vps <- baseViewports() 
pushViewport(vps$figure,vps$plot) 
with(as.list(c(a,b,d)),{ 
    grid.polygon(x = xA, y = yA,gp =gpar(fill='red',lty=1,alpha=0.2)) 
    grid.polygon(x = xB, y = yB,gp =gpar(fill='green',lty=2,alpha=0.2)) 
    grid.polygon(x = xD, y = yD,gp =gpar(fill='blue',lty=3,alpha=0.2)) 
} 
) 
upViewport(2) 

enter image description here

Verwandte Themen