2013-03-15 12 views
7

Używając R, narysowałem wysklepioną działkę podobną do this. Chcę wykonać następujące 4 czynności w: ROgólne problemy dotyczące działki

  1. Dodaj legendę zgodnie z linkiem.
  2. Zamień nazwę osi X na grecki symbol delty
  3. Aby wymienić różne punkty przecięcia na działce. dla np. przy x = 0,75 kilka krzywych odpowiada osi X, chcę ustawić wartość 0.75 w pobliżu tego punktu.
  4. Jeśli widzisz krzywe, nie są one gładkie. Jak sprawić, by były gładkie? Nawet excel kreśli o wiele bardziej płynne krzywe.

Jak to osiągnąć?

Oto fabuła.

plot

Poniższy kod służy do rysowania wykresu.

plot(NA,xlim=c(0,1),ylim=c(0,1),xlab="delta",ylab="K", xaxs="i",yaxs="i") # Empty plot 
a1 <- curve((x+x^7-x^2-x^4)/(1+x-x^3-x^4), from=0, n=450000, add = TRUE) # First curve 
a2 <- curve((x^2+x^3-x-x^5)/(x+x^2), to=0.9, n=45000, add = TRUE) 
a3 <- curve((x+x^7-x^2-x^4)/(1+x-x^2-x^3-x^4+x^7),from=0, n=45000, add = TRUE) 
a4 <- curve((x+x^8-x^3-x^5)/(x+x^8-x^3-x^5+1-x^4),from=0, to=0.9, n=45000, add = TRUE) 
a5 <- curve((x+x^8-x^3-x^5)/(1+x-x^5-x^4),from=0, n=45000, add = TRUE) 
a6 <- curve((x+x^2-x^4-1)/(x-x^4), to=0.84, n=45000, add = TRUE) 
a7 <- curve((x+x^6-x^3-x^4)/(1+x-x^3-x^4), from=0.83 ,to=1, n=45000, add = TRUE) 
a8 <- curve((1+x^7-x^2-x^4)/(1+x^3-x-x^4), from=0.819, n=45000, add = TRUE) 
a9 <- curve((x)/(1+x), n=45000,from=0.819, to =1, add = TRUE) 


names(a1) <- c('xA1','yA1') 
names(a2) <- c('xA2','yA2') 
names(a3) <- c('xA3','yA3') 
names(a4) <- c('xA4','yA4') 
names(a5) <- c('xA5','yA5') 
names(a6) <- c('xA6','yA6') 
names(a7) <- c('xA7','yA7') 
names(a8) <- c('xA8','yA8') 
names(a9) <- c('xA9','yA9') 


with(as.list(c(a1,a2,a3,a4,a5,a6,a7,a8,a9)),{ 

idA <- yA3 >=0 
idB <- yA2 >=0 & yA2 <= yA4 
idC <- yA4 >= yA2 

idD <- yA5 >=0 

idE <- yA6 >=0 & yA6 <= yA7 
idF <- yA7 <= yA6 

idG <- yA8 >=0 & yA8 <= yA9 
idH <- xA9 >= xA8 & xA9 >0.8 

idI <- xA1 >=0 & xA1 <= 0.755 
idJ <- xA3 >=0 & xA3 <= 0.755 



polygon(x = c(xA3[idA],xA2[idB],rev(xA4[idC])), 
     y = c(yA3[idA],yA2[idB],rev(yA4[idC])), 
     density=20, angle=90, border=NULL) 

polygon(x = c(xA5[idD],1,1,0), 
     y = c(yA5[idD],0,1,1), 
     density=20, angle=0, border=NULL) 

polygon(x = c(xA6,xA7), 
     y = c(yA6,yA7), 
     density=20, angle=45, border=NULL) 

polygon(x = c(rev(xA8[idG]),xA9[idH],1), 
     y = c(rev(yA8[idG]),yA9[idH],0), 
     density=20, angle=135, border=NULL) 

polygon(x = c(xA1[idI],rev(xA3[idJ])), 
     y = c(yA1[idI],rev(yA3[idJ])), 
     col="black", border=NULL) 


}) 
+3

Nie można poważnie oczekiwać odpowiedzi od opublikowania tego? Dodaj kilka informacji o tym, jak narysowałeś swoją grafikę. Sposób dodawania legendy będzie różnił się w zależności od tego, czego użyjesz do wykreślenia wykresu (krata, siatka, podstawa itp.). –

+0

Dlaczego nie dodałeś go do tego pytania? http://stackoverflow.com/questions/15385063/easiest-way-to-plot-qualities-with-hatched-fill – JT85

+3

Świetna edycja i fajny wykres. +1 dla jasnego, powtarzalnego pytania. W przyszłości rozważ rozwiąż wszystkie swoje pytania w ten sposób. –

Odpowiedz

10
layout(matrix(c(1,2),nrow=1), 
     width=c(4,1)) #Divide your plotting region in two inequal part 
par(mar=c(5,4,4,0)) #Get rid of the margin on the right side 
plot(NA,xlim=c(0,1),ylim=c(0,1), 
    xlab=expression(delta),ylab="K", xaxs="i",yaxs="i") # Here's your delta 
a1 <- curve((x+x^7-x^2-x^4)/(1+x-x^3-x^4), from=0, n=450000, add = TRUE) 

... 

par(mar=c(5,0,4,2)) #No margin on the left side 
plot(c(0,1),type="n", axes=F, xlab="", ylab="") #Empty plot 
legend("top",legend=c("1","2","3","4","5"), 
     density=c(20,20,20,20,NA), angle=c(90,0,45,135,NA), 
     col=c(NA,NA,NA,NA,"black"), bty="n", cex=1.5) 

enter image description here

Co do punktu, który chcesz oznaczyć, albo użycie funkcji text (lub mtext) to zrobić "programmaticaly" lub locator to zrobić interaktywnie.

Edit: Ewentualnie (jak powiedziałem w komentarzach), to będzie działać, jak również umieścić swoją legendę poza obszar działki i jest chyba prostsze:

par(mar=c(5,4,4,8)) 
plot(NA,xlim=c(0,1),ylim=c(0,1), 
    xlab=expression(delta),ylab="K", xaxs="i",yaxs="i") # Here's your delta 
    a1 <- curve((x+x^7-x^2-x^4)/(1+x-x^3-x^4), from=0, n=450000, add = TRUE) 

... 

legend(1,1,legend=c("1","2","3","4","5"), 
    density=c(20,20,20,20,NA), angle=c(90,0,45,135,NA), 
    col=c(NA,NA,NA,NA,"black"), bty="n", cex=1.5, xpd=TRUE) 
+2

+1! Jesteś niesamowitym człowiekiem!Zapominam o "układzie"! – agstudy

+0

Dzięki! Alternatywą dla używania 'layout' w tym przypadku mogłoby być zwiększenie prawego marginesu (powiedz' par (mar = c (5,4,4,8))) i narysuj legendę na zewnątrz używając argumentu 'xpd = TRUE':' legend (1,1, legend = ..., xpd = TRUE) ' – plannapus

+0

Właściwie myślę, że zamierzam zmienić moją odpowiedź na to, ponieważ jest to prostsze rozwiązanie. – plannapus

8

Tradycyjny układ graficzny zapewnia funkcję legenda() przez dodanie legendę lub klucz do działki. Legenda jest zwykle rysowana w obszarze wykresu, i jest umieszczona względem współrzędnych użytkownika.

Funkcja ma wiele argumentów, tutaj musimy użyć kąt i gęstość argumenty odróżnić regiony mieszany.

legend(0.5, 0.8, paste("region", 1:5), 
     density=c(20,20,20,20,0), 
     angle=c(90,0,45,135,0)) 

enter image description here

+0

to było szybkie. jak dodać czarny region do legendy? także, jak umieścić legendę poza obszarem fabuły? –

+0

poza obszarem działki? masz na myśli w lewo lub w prawo? – agstudy

+0

najlepiej u dołu, w przeciwnym razie dobrze. czy możliwe jest napisanie legendy "od lewej do prawej" instaed od "z góry na dół"? –