R'de aynı grafikte iki grafik çizin


571

Aynı plana y1 ve y2'yi çizmek istiyorum.

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

Ama bunu böyle yaptığımda, birlikte aynı arsada çizilmezler.

Matlab'da bunu yapabilirsiniz hold on, ama kimse bunu R'de nasıl yapacağını biliyor mu?


3
Kontrol edin ?curve. Kullanın add=TRUE.
izomorphismes

Daha spesifik ggplot2 cevapları için bu soruya bakın .
Axeman

Yanıtlar:


617

lines()veya points()mevcut grafiğe eklenir, ancak yeni bir pencere oluşturmaz. Yani yapmanız gerekecek

plot(x,y1,type="l",col="red")
lines(x,y2,col="green")

10
Aşağıdaki basit örnekte neden çalışmıyor? As.double (y) 'de> arsa (sin)> hatları (cos) Hata: can 'çift' tür vektör için zorlamak için tip 'yerleşik'
Frank

23
Bunu görmek kolaydır. Plot (sin) ile, gerçek veriler yerine bir fonksiyon geçiriyorsunuz. plot () bunu algılar ve sırayla işlevinizi çizmek için plot.function () işlevini kullanır (bu konuda daha fazla bilgi edinmek için birden fazla gönderimi okuyun). Ancak lines.function () tanımlanmadığından lines (), class işlevinin bir parametresiyle ne yapılacağını bilmez. satırları yalnızca sınıfınızdaki verileriniz ve zaman serisi nesnelerinizle ilgilenebilir.
Soumendra

27
@Frank Do bu gibi: plot(sin); curve(cos, add=TRUE).
izomorphismes

2
X farklıysa aynı nasıl kullanılır? Diyelim ki, bir grafik için x1 ve y1 var ve aynı grafikte x2 ve y2'nin başka bir grafiğini ekliyorum. Hem x1 hem de x2 aynı aralığa ancak farklı değerlere sahiptir.
Kavipriya

1
Aynı şey: lines(x2,y2,...)yerinelines(x,y2,...)
bnaul

220

parAynı grafiği ancak farklı ekseni de kullanabilir ve çizebilirsiniz. Aşağıdaki gibi bir şey:

plot( x, y1, type="l", col="red" )
par(new=TRUE)
plot( x, y2, type="l", col="green" )

Hakkında detaylı okursanız parin R, gerçekten ilginç grafikler oluşturmak mümkün olacak. Bakılacak başka bir kitap Paul Murrel'in R Graphics'i.


3
Benim R hata veriyor:

5
Metodunuz iki grafik için doğru ölçeği (y ekseni) koruyor mu?
Alessandro Jacopson

1
@ uvts_cvs Evet, orijinal grafiği toto olarak korur.
Sam

10
Buradaki sorun, birkaç çizim öğesini yeniden yazmasıdır. Ben xlab="", ylab="", ...ikinci ve birkaç diğerleri dahil plot.
13:45, izomorfizmalar

118

Çok katmanlı araziler oluştururken ggplotpaket düşünülmelidir . Fikir, temel estetiği olan bir grafik nesne yaratmak ve onu aşamalı olarak geliştirmektir.

ggplotstyle, verilerin paketlenmesini gerektirir data.frame.

# Data generation
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x,y1,y2)

Temel çözüm:

require(ggplot2)

ggplot(df, aes(x)) +                    # basic graphical object
  geom_line(aes(y=y1), colour="red") +  # first layer
  geom_line(aes(y=y2), colour="green")  # second layer

Burada + operatortemel nesneye fazladan katmanlar eklemek için kullanılır.

İle ggplotsize komplo her aşamasında üzerinde grafiksel nesneye erişimi vardır. Diyelim ki, normal adım adım kurulum şöyle görünebilir:

g <- ggplot(df, aes(x))
g <- g + geom_line(aes(y=y1), colour="red")
g <- g + geom_line(aes(y=y2), colour="green")
g

gçizimi üretir ve her aşamada görebilirsiniz (en az bir katmanın oluşturulmasından sonra). Parselin daha fazla büyüsü de yaratılmış nesne ile yapılır. Örneğin, eksenler için etiketler ekleyebiliriz:

g <- g + ylab("Y") + xlab("X")
g

Final gşöyle görünür:

resim açıklamasını buraya girin

GÜNCELLEME (2013-11-08):

Yorumlarda belirtildiği gibi, ggplotfelsefesi verileri uzun formatta kullanmanızı önerir. İlgili kodu görmek için bu cevaba başvurabilirsiniz .


5
Henrik tarafından önerildiği gibi , veriler gerçekten "uzun" biçiminde olmalıdır, ggplotbunu kullandığınız "geniş" biçimden daha doğal olarak ele alır.
krlmlr

1
@Henrik: Hayır, en başta cevabınız için teşekkür ederim. Belki de bu cevabın yazarı, ggplot'felsefesine iyi uyması için düzenleyebilir ...
krlmlr

1
@krlmlr, cevabımı soruyu daha açık bir şekilde ele alacak şekilde düzenlemeye çalıştım. Lütfen daha fazla güncelleme önermekten çekinmeyin. Şerefe.
Henrik

3
bana ggplot (aes ()) üzerinde x tanımlamayı ve daha sonra kendi başına _ * () y üzerinde tanımlamayı öğretti. Güzel!
Dan

41

Aradığınız cevabın şu olduğunu düşünüyorum:

plot(first thing to plot)
plot(second thing to plot,add=TRUE)

25
Bu işe yaramıyor gibi görünüyor, bir "add" is not a graphical parameteruyarı veriyor ve sadece birincinin üzerine ikinci grafiği yazdırıyor.
Waldir Leoncio


Bunun güzel bir yararı, eksenlerin sınırlarını ve başlıklarını tutarlı tutmasıdır. Önceki yöntemlerden bazıları, daha fazla seçenek belirtmeyle ilgili sorun yaşamadığınız sürece, R'nin y eksenine iki takım onay işareti çizmesine neden olur. Söylemeye gerek yok, eksenlerde iki takım onay işaretine sahip olmak çok yanıltıcı olabilir.
RMurphy

1
Eklenti parametre R baz / varsayılan birini bazı arsa yöntemleri için çalışır, ancak
cloudscomputes

2
Aynı hatayı aldım "add" is not a graphical parameter. Benim R R version 3.2.3 (2015-12-10). par(new=TRUE)Bu grafikler arasında komut kullanabilirsiniz .
quepas

29

matplotİşlevi kullanın :

matplot(x, cbind(y1,y2),type="l",col=c("red","green"),lty=c(1,1))

y1ve y2aynı xnoktalarda değerlendirilirse bunu kullanın . O hangisi uyum için Y ekseni ölçekler daha büyük ( y1veya y2), keser burada diğer bazı yanıtlar aksine y2o daha büyük alırsa y1(ggplot çözümler çoğunlukla bunu kabul vardır).

Alternatif olarak ve iki satır aynı x koordinatlarına sahip değilse, ilk grafikte eksen sınırlarını ayarlayın ve ekleyin:

x1  <- seq(-2, 2, 0.05)
x2  <- seq(-3, 3, 0.05)
y1 <- pnorm(x1)
y2 <- pnorm(x2,1,1)

plot(x1,y1,ylim=range(c(y1,y2)),xlim=range(c(x1,x2)), type="l",col="red")
lines(x2,y2,col="green")

Bu Q 4 yaşında ve kimse bahsetmedi matplotya da şaşırdım x/ylim...


25

tl; dr:curve (ile add=TRUE) veya kullanmak istiyorsunuz lines.


Kabul etmiyorum par(new=TRUE)çünkü bu onay işaretlerini ve eksen etiketlerini iki katına basacak. Örneğin

sinüs ve parabol

Çıktı plot(sin); par(new=T); plot( function(x) x**2 ).

Dikey eksen etiketlerinin ne kadar dağınık olduğuna bakın! Aralıkları farklı olduğu için sete gerekir ylim=c(lowest point between the two functions, highest point between the two functions)sana göstermek üzere olduğum şey daha az kolaydır --- ve hangi yolu değil, sadece iki eğri, ancak birçok eklemek istiyorsanız kolay azdır.


Ne zaman komplo hakkında bana karıştı arasındaki farktır curveve lines. (Bunların iki önemli çizim komutunun adı olduğunu hatırlayamıyorsanız, sadece söyleyin .)

İşte curveve arasındaki büyük fark lines.

curvegibi bir işlevi çizer curve(sin). linesgibi x ve y değerleri, parseller noktası: lines( x=0:10, y=sin(0:10) ).

Ve burada küçük bir fark var: Yapmaya çalıştığınız şey curveiçin çağrılmalı, mevcut bir arsaya eklediğinizi varsayalım.add=TRUElines

id ve sinüs

İşte aramanın sonucu plot(0:2); curve(sin).


Perde arkasında kontrol edin methods(plot). Ve kontrol edin body( plot.function )[[5]]. plot(sin)R'yi çağırdığınızda sinbunun bir işlev olduğunu (y değerleri değil) ve plot.functionçağrıyı sonuçlandıran yöntemi kullandığını anlarsınız curve. Yani curveişlevleri işlemek anlamına araçtır.



16

@Redmode tarafından açıklandığı gibi, kullanarak aynı grafik aygıtındaki iki satırı çizebilirsiniz ggplot. Bu cevapta veriler 'geniş' formattaydı. Bununla birlikte, ggplotverileri kullanırken genellikle veri çerçevesindeki verileri 'uzun' bir formatta tutmak en uygunudur. Daha sonra, aesgenetik argümanlarında farklı 'gruplama değişkenleri' kullanıldığında, çizginin çizgi tipi veya renk gibi özellikleri gruplama değişkenine göre değişir ve karşılık gelen göstergeler görünecektir.

Bu durumda, coloursatırların rengini veri kümesindeki bir değişkenin farklı düzeyleriyle eşleşen aessthetics'i kullanabiliriz (burada: y1 ve y2). Ancak önce, örneğin reshape2paketten 'erit' işlevini kullanarak verileri genişten uzun biçime eritmemiz gerekir. Verileri yeniden şekillendirmek için diğer yöntemler burada açıklanmıştır: data.frame'i genişden uzun biçime yeniden şekillendirmek .

library(ggplot2)
library(reshape2)

# original data in a 'wide' format
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
df <- data.frame(x, y1, y2)

# melt the data to a long format
df2 <- melt(data = df, id.vars = "x")

# plot, using the aesthetics argument 'colour'
ggplot(data = df2, aes(x = x, y = value, colour = variable)) + geom_line()

resim açıklamasını buraya girin


15

Temel grafikler (ör. Kafes / ızgara grafikleri değil) kullanıyorsanız, yeni bir arsa başlatmadan grafiklerinize ek ayrıntılar eklemek için noktalar / çizgiler / çokgenler işlevlerini kullanarak MATLAB'ın bekletme özelliğini taklit edebilirsiniz. Çok alanlı düzen durumunda, par(mfg=...)hangi grafiği ekleyeceğinizi seçmek için kullanabilirsiniz.



7

Bir dizide çizilecek değerleri tutmak yerine, bunları bir matriste saklayın. Varsayılan olarak tüm matris tek bir veri kümesi olarak ele alınır. Ancak, matriste satırlarınız olduğu gibi, çizime aynı sayıda değiştirici eklerseniz, örneğin col (), R, her satırın bağımsız olarak ele alınması gerektiğini anlayacaktır. Örneğin:

x = matrix( c(21,50,80,41), nrow=2 )
y = matrix( c(1,2,1,2), nrow=2 )
plot(x, y, col("red","blue")

Veri kümeleriniz farklı boyutlarda değilse bu işe yarayacaktır.


Bu verir: if (as.factor) {: argümanı mantıksal olarak yorumlanamazsa hata verir
baouss


5

Buradaki gggplot2 örneklerinden herhangi birini etkileşimli bir arsaya dönüştürmek ggplotly()için plotly paketindeki işlevi kullanabilirsiniz , ancak bu tür bir arsa ggplot2 olmadan daha iyi olduğunu düşünüyorum :

# call Plotly and enter username and key
library(plotly)
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

plot_ly(x = x) %>%
  add_lines(y = y1, color = I("red"), name = "Red") %>%
  add_lines(y = y2, color = I("green"), name = "Green")

resim açıklamasını buraya girin


plotly parlak görünüyor; ücretsiz mi
denis

@denis, sınırsız ücretsiz kamu arsa ve ücretli özel arsa veya yerinde seçenekler vardır. Planlar sayfasına bakın .
Mateo Sanchez

4
Plotly R paketi artık% 100 ücretsiz ve açık kaynaklıdır (MIT lisanslı). Bunu komplo hesabıyla veya hesap olmadan kullanabilirsiniz.
Carson

4

Çiziminizi ggvis kullanarak da oluşturabilirsiniz :

library(ggvis)

x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
df <- data.frame(x, y1, y2)

df %>%
  ggvis(~x, ~y1, stroke := 'red') %>%
  layer_paths() %>%
  layer_paths(data = df, x = ~x, y = ~y2, stroke := 'blue')

Bu aşağıdaki grafiği oluşturacaktır:

resim açıklamasını buraya girin


2

Kullanma plotly( plotlybirincil ve ikincil y ekseni ile çözüm ekleme- Eksik gibi görünüyor):

library(plotly)     
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)

df=cbind.data.frame(x,y1,y2)

  plot_ly(df) %>%
    add_trace(x=~x,y=~y1,name = 'Line 1',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE) %>%
    add_trace(x=~x,y=~y2,name = 'Line 2',type = 'scatter',mode = 'lines+markers',connectgaps = TRUE,yaxis = "y2") %>%
    layout(title = 'Title',
       xaxis = list(title = "X-axis title"),
       yaxis2 = list(side = 'right', overlaying = "y", title = 'secondary y axis', showgrid = FALSE, zeroline = FALSE))

Çalışan demodan ekran görüntüsü:

resim açıklamasını buraya girin


Kodu derledim ve çalışmıyor, önce%>% içinde bir hata işaretledim ve sildim, sonra Error in library(plotly) : there is no package called ‘plotly’neden bir hata işaretledim ?
Bellatrix

Paketi kurdunuz plotlymu? install.packages("plotly")Komutu kullanarak paketi yüklemeniz gerekir .
Saurabh Chauhan

1

kafes kütüphanesini de kullanabiliriz

library(lattice)
x <- seq(-2,2,0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)
xyplot(y1 + y2 ~ x, ylab = "y1 and y2", type = "l", auto.key = list(points = FALSE,lines = TRUE))

Belirli renkler için

xyplot(y1 + y2 ~ x,ylab = "y1 and y2", type = "l", auto.key = list(points = F,lines = T), par.settings = list(superpose.line = list(col = c("red","green"))))

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.