r - خطي - كيفية رسم منحنى بياني في excel




رسم اثنين من الرسوم البيانية في نفس المؤامرة في R (10)

أعتقد أن الإجابة التي تبحث عنها هي:

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

أود أن أرسم y1 و y2 في نفس المؤامرة.

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")

ولكن عندما أفعل ذلك من هذا القبيل ، لم يتم رسمها في نفس المؤامرة معًا.

في Matlab يمكن للمرء أن hold on ، ولكن هل يعرف أي شخص كيفية القيام بذلك في R؟


إذا كنت ترغب في تقسيم الشاشة ، يمكنك القيام بذلك على النحو التالي:

(على سبيل المثال لمدة 2 المؤامرات المقبل معا)

par(mfrow=c(1,2))

plot(x)

plot(y) 

رابط المرجع


استخدم وظيفة matplot :

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

استخدم هذا إذا تم تقييم y1 و y2 في نفس نقاط x . يقوم بتحجيم المحور ص لتلائم أيهما أكبر ( y1 أو y2 ) ، على عكس بعض الإجابات الأخرى هنا التي ستقوم بقص y2 إذا كانت أكبر من y1 (حلول ggplot في الغالب مقبولة مع هذا).

بدلاً من ذلك ، وإذا لم يكن للسطريين نفس إحداثيات x ، فضع حدود المحور على الرسم البياني الأول وأضف:

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")

أنا مندهش من هذا س 4 سنوات من العمر ، ولم matplot أحد ذكر matplot أو x/ylim ...


بدلاً من حفظ القيم المراد رسمها في صفيف ، قم بتخزينها في مصفوفة. بشكل افتراضي ، سيتم التعامل مع المصفوفة بأكملها على أنها مجموعة بيانات واحدة. ومع ذلك ، إذا قمت بإضافة نفس العدد من المعدلات إلى المؤامرة ، على سبيل المثال ، col () ، كما لديك صفوف في المصفوفة ، فإن R ستكتشف أن كل صف يجب أن يعامل بشكل مستقل. فمثلا:

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

يجب أن يعمل ذلك ما لم تكن مجموعات البيانات الخاصة بك ذات أحجام مختلفة.


كما هو موضح بواسطةredmode ، يمكنك رسم الخطين في نفس الجهاز الرسومية باستخدام ggplot . ومع ذلك ، كانت البيانات في هذه الإجابة بتنسيق "واسع" ، بينما في ggplot ، يكون من الملائم عمومًا الاحتفاظ بالبيانات في إطار البيانات بتنسيق "طويل". بعد ذلك ، باستخدام "متغيرات التجميع" المختلفة في وسائط atics ، ستختلف خصائص الخط ، مثل linetype أو color ، وفقًا لمتغير التجميع ، وستظهر الأساطير المقابلة. في هذه الحالة ، يمكننا استخدام colour اللاصقة الملونة ، والتي تتطابق مع لون الخطوط إلى مستويات مختلفة من متغير في مجموعة البيانات (هنا: y1 مقابل y2). ولكن نحتاج أولاً إلى إذابة البيانات من صيغة واسعة إلى طويلة ، وذلك باستخدام الدالة "تذوب" من حزمة reshape2 .

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()


يمكن ترجمة plot(x1,y1,x2,y2) Idiomatic Matlab plot(x1,y1,x2,y2) في R مع ggplot2 على سبيل المثال بهذه الطريقة:

x1 <- seq(1,10,.2)
df1 <- data.frame(x=x1,y=log(x1),type="Log")
x2 <- seq(1,10)
df2 <- data.frame(x=x2,y=cumsum(1/x2),type="Harmonic")

df <- rbind(df1,df2)

library(ggplot2)
ggplot(df)+geom_line(aes(x,y,colour=type))

مستوحاة من مؤامرات الخط المزدوج Tingting Zhao مع مجموعة مختلفة من محور س باستخدام ggplot2 .


يمكنك أيضًا استخدام الرسم البياني والرسم على نفس الرسم البياني ولكن في محور مختلف. شيء على النحو التالي:

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

إذا كنت تقرأ بالتفصيل حول par في R ، R من إنشاء رسوم بيانية مثيرة للاهتمام حقًا. كتاب آخر للنظر في هو بول Murrel's R الرسومات.


يمكنك استخدام Plotly R API لتصميم هذا. في ما يلي رمز تنفيذ ذلك ، والنسخة المباشرة من هذا الرسم البياني here .

# call Plotly and enter username and key
library(plotly)
p <- plotly(username="Username", key="API_KEY")

# enter data
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x,1,1)

# format, listing y1 as your y.
First <- list(
x = x,
y = y1,
type = 'scatter',
mode = 'lines',
marker = list(
    color = 'rgb(0, 0, 255)',
    opacity = 0.5
 )
)

# format again, listing y2 as your y.
Second <- list(
x = x,
y = y2,
type = 'scatter',
mode = 'lines',
opacity = 0.8, 
marker = list(
    color = 'rgb(255, 0, 0)'
 )
)

# style background color
plot_bgcolor = 'rgb(245,245,247)'

# and structure the response. Plotly returns a URL when you make the call. 
response<-p$plotly(list(First,Second), kwargs = list(layout=layout))

الكشف الكامل: أنا في فريق Plotly.


lines() أو points() ستضيف إلى الرسم البياني الموجود ، ولكن لن إنشاء إطار جديد. لذلك عليك القيام به

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

tl؛ dr: أنت تريد استخدام curve (مع add=TRUE ) أو lines .

لا أوافق مع par(new=TRUE) لأن ذلك سيؤدي إلى مضاعفة علامات التجزئة وتصنيفات المحاور. على سبيل المثال

إخراج plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) plot(sin); par(new=T); plot( function(x) x**2 ) .

انظروا كيف تعطل تسميات المحور الرأسي! بما أن النطاقات مختلفة ، فستحتاج إلى تعيين ylim=c(lowest point between the two functions, highest point between the two functions) ، وهو أقل سهولة من ما أنا على وشك أن أظهره لك - والطريقة أقل سهولة إذا كنت ترغب في إضافة ليس فقط منحنيات اثنين ، ولكن الكثير.

ما يزعجني دائما عن التآمر هو الفرق بين curve lines . (إذا كنت لا تتذكر أن هذه هي أسماء الأمرين المهمين في التخطيط ، قم فقط sing .)

وهنا الفرق الكبير بين curve lines .

curve سيرسم وظيفة ، مثل curve(sin) . lines إلى قيم x و y مثل: lines( x=0:10, y=sin(0:10) ) .

وهنا اختلاف بسيط: يجب استدعاء curve مع add=TRUE لما تحاول القيام به ، بينما تفترض lines بالفعل أنك تضيف إلى مخطط موجود بالفعل.

وهنا نتيجة plot(0:2); curve(sin) الدعوة plot(0:2); curve(sin) plot(0:2); curve(sin) .

وراء الكواليس ، تحقق من methods(plot) . وفحص body( plot.function )[[5]] . عند استدعاء plot(sin) R يتضح أن sin هي وظيفة (وليس القيم ص) ويستخدم أسلوب plot.function ، الذي ينتهي curve الدعوة. لذا فإن curve هو الأداة التي تعني التعامل مع الوظائف.





r-faq