R: الرسم البياني الأساسي في لغة R

آخر تحديث: 2026-08-26

يبدأ هذا الدرس قسم «الرسوم البيانية» من دليل تعلم لغة R — تصوير البيانات. تتوفر في لغة R نظامان للرسم البياني: R الأساسي (plot/line/bar) و ggplot2 (ggplot + geom_). في هذا الدرس، سنبدأ بتعلم الرسم البياني باستخدام R الأساسي — فهو بسيط وسريع، مما يجعله خيارًا مثاليًّا للتحقق السريع من البيانات.

بعد الانتهاء من هذا الدرس، ستتمكن من إنشاء ستة أنواع أساسية من الرسوم البيانية في لغة R: الرسوم البيانية المبعثرة، والرسوم البيانية الخطية، والرسوم البيانية الشريطية، والرسوم البيانية الدائرية، والرسوم البيانية التكرارية، والرسوم البيانية الصندوقية.

1. ما ستتعلمه



2. قصة عن التصور البصري للمبيعات

(1) المشكلة: الجدول ليس بديهياً بما فيه الكفاية

قدم بوب أرقام المبيعات للربع الرابع إلى المدير:

TEXT 📖 للعرض فقط
Region    Q1    Q2    Q3    Q4
Beijing  1000  1200  1100  1500
Shanghai  1500  1800  1700  2000
Guangzhou   800   900  1000  1200

ألقى المدير نظرة سريعة عليه وقال: «لا يهمني الأرقام — أعطني الرسم البياني فحسب».

(2) الحل باستخدام لغة R

R
# 1. A Line Chart in One Line of Code(4 Quarterly City Trends)
plot(sales, type = "b", col = rainbow(4), main = "Quarterly Sales Trends")

# 2. Creating a bar chart in one line(4 Total City Sales)
barplot(rowSums(sales[, -1]), main = "Total Sales Comparison", col = "skyblue")

# 3. A Line Chart(Percentage)
pie(rowSums(sales[, -1]), labels = rownames(sales))

3 أسطر من التعليمات البرمجية → 3 رسوم بيانية. هذه هي السرعة التي يتم بها إنشاء الرسوم البيانية الأساسية في لغة R.



3. نظاما الرسم البياني في لغة R

(1) المقارنة

مقال خاص أساسيات لغة R (الرسوم البيانية) ggplot2
السرعة سريع جدًا (10 أسطر) أبطأ (عشرات الأسطر)
سهولة التعلم ✅ بسيط ❌ منحنى تعلم حاد
افتراضي، جذاب ❌ أساسي ✅ بجودة النشر
المرونة ⚠️ محدودة ✅ مرونة عالية
السيناريوهات المناسبة مراجعة سريعة للبيانات المنشورات/التقارير
قواعد النحو الأساسية "الرسم على اللوحة" قواعد الرسومات

(2) متى يستخدم أي منهما؟

100%
graph TB
    A[Imagination Drawing] --> B{Scene}
    B -->|Quick Data Overview| C[Basics R plot]
    B -->|Published/Report| D[ggplot2]
    B -->|Teaching Demonstration| E[Either one is fine]
    
    style A fill:#fff3cd
    style C fill:#d4edda
    style D fill:#cce5ff
💡 نصيحة: استخدم لغة R الأساسية (السريعة) من أجل التحليل السريع للبيانات، واستخدم ggplot2 (الجميلة) من أجل كتابة التقارير والأوراق البحثية. يتناول هذا الدرس لغة R الأساسية؛ أما الدرس التالي فسيتناول ggplot2.



4. plot(): رسوم بيانية متعددة الاستخدامات (بشكل أساسي رسوم بيانية مبعثرة)

(1) مخطط الانتشار الأساسي

R
# Plot a scatter plot of two columns of data
x <- 1:10
y <- x ^ 2
plot(x, y)

(2) المعلمات المشتركة

R
plot(x, y,
     type = "p",           # Graph Type
     main = "Title",
     xlab = "X Axis",
     ylab = "Y Axis",
     col = "blue",         # Color
     pch = 19,             # Point-shaped(0-25)
     cex = 1.5,            # Font Size
     xlim = c(0, 12),     # X Shaft Range
     ylim = c(0, 110))    # Y Shaft Range

(3) 6 أنواع

النوع المعنى الغرض
"p" النقاط (الافتراضي) مخطط الانتشار
"l" خط مخطط خطي
"b" النقاط والخطوط مخطط الاتجاه
"o" نقطة عبر خط سلسلة زمنية
"h" خط عمودي مخطط شريطي (نسخة خطية)
"s" السلالم مخطط الدرج
R
# For the same set of data, 6 A Painting Technique
x <- 1:5
y <- c(2, 4, 3, 5, 4)

par(mfrow = c(2, 3))  # 2 row 3 Column Layout
for (t in c("p", "l", "b", "o", "h", "s")) {
  plot(x, y, type = t, main = paste("type =", t))
}


5. 6 مخططات أساسية

(1) مخطط الانتشار plot()

R
# 4 City Scatter Plot
x <- c(1, 2, 3, 4)
y <- c(1000, 1500, 800, 1200)
plot(x, y,
     main = "City Sales Scatter Plot",
     xlab = "City Code",
     ylab = "Sales",
     col = "blue",
     pch = 19)

(2) رسم مخطط خطي (type = "l")

R
# Quarterly Trend Chart
quarters <- c("Q1", "Q2", "Q3", "Q4")
sales <- c(1000, 1200, 1100, 1500)

plot(quarters, sales,
     type = "b",     # Point + Line
     main = "Q1-Q4 Sales Trends",
     xlab = "Quarter",
     ylab = "Sales",
     col = "darkblue",
     lwd = 2,        # Line width
     pch = 19)

(3) المخطط الشريطي barplot()

R
# 4 City Sales Bar Chart
sales_data <- c(Beijing = 4800, Shanghai = 7000, Guangzhou = 3900, Shenzhen = 4500)

barplot(sales_data,
        main = "Total Sales by City",
        xlab = "City",
        ylab = "Sales",
        col = c("red", "blue", "green", "orange"),
        border = "white",
        horiz = FALSE)  # TRUE Sideways

(4) الرسم البياني الدائري pie()

R
# Sales Share Pie Chart
sales_data <- c(Beijing = 4800, Shanghai = 7000, Guangzhou = 3900, Shenzhen = 4500)

pie(sales_data,
    main = "Share of Sales",
    col = rainbow(4),
    labels = paste0(names(sales_data), "\n", sales_data))
⚠️ ملاحظة: لا يُنصح باستخدام المخططات الدائرية — فالعين البشرية ليست حساسة للزوايا، لذا فإن المخططات الشريطية أكثر دقة. كما يوصي مؤلف مكتبة ggplot2 باستخدام geom_bar() بدلاً من pie().

(5) الرسم البياني التكراري hist()

R
# 1000 The Distribution of a Random Number
data <- rnorm(1000, mean = 100, sd = 15)

hist(data,
     main = "Normal Distribution",
     xlab = "Value",
     ylab = "Frequency",
     col = "lightblue",
     border = "white",
     breaks = 30)  # min 30 a range

(6) مخطط الصندوق boxplot()

R
# 4 Class Exam Score Distribution
scores <- list(
  1Cls = c(85, 90, 78, 92, 88, 76, 95, 80),
  2Cls = c(72, 80, 85, 78, 90, 88, 82, 75),
  3Cls = c(95, 88, 92, 90, 85, 78, 80, 88),
  4Cls = c(60, 65, 70, 75, 80, 85, 90, 95)
)

boxplot(scores,
        main = "4 Class Grade Distribution",
        xlab = "Class",
        ylab = "Fractions",
        col = c("red", "blue", "green", "orange"))


6. معلمات الرسم البياني في الدالة par()

(1) وفقًا لجدول المرجع السريع

المعلمة الوظيفة مثال
mfrow تخطيط متعدد الصور (صفوف × أعمدة) par(mfrow = c(2, 2))
mar الهامش (4 أرقام) par(mar = c(5, 4, 4, 2))
bg لون الخلفية par(bg = "lightyellow")
col اللون الافتراضي par(col = "blue")
cex حجم النص الافتراضي par(cex = 1.2)
lty خط متصل par(lty = 2) خط متقطع
pch شكل النقطة par(pch = 19)

(2) تخطيط متعدد الصور

R
# 2x2 Layout
par(mfrow = c(2, 2))

plot(1:10, main = "Plot 1")
plot(1:10, type = "l", main = "Plot 2")
barplot(1:5, main = "Plot 3")
pie(1:4, main = "Plot 4")

# Restore Default Layout
par(mfrow = c(1, 1))

(3) layout() التخطيط المرن

R
# 1 L + 4 S Layout
layout(matrix(c(1, 1, 2, 3,
                1, 1, 4, 5), nrow = 2, byrow = TRUE))

plot(1:10, main = "Large Image")           # 1
plot(1:5, main = "Small image 1")          # 2
plot(1:5, main = "Small image 2")          # 3
plot(1:5, main = "Small image 3")          # 4
plot(1:5, main = "Small image 4")          # 5

layout(1)  # Restore


7. اللون وشكل النقطة

(1) اللون

R
# 1. Name
plot(1:5, col = "red")
plot(1:5, col = "blue")
plot(1:5, col = "darkgreen")

# 2. Hexadecimal
plot(1:5, col = "#FF0000")
plot(1:5, col = "#3366CC")

# 3. rainbow() Color Palette
barplot(1:7, col = rainbow(7))
barplot(1:7, col = heat.colors(7))
barplot(1:7, col = topo.colors(7))
barplot(1:7, col = terrain.colors(7))

(2) شكل النقطة pch

pch الشكل الغرض
0–6 مجوفة أشكال متنوعة
19–25 صلب موصى به (واضح)
19 النقاط الأكثر شيوعًا
17 المثلث التأكيد
15 كتلة ثنائي
R
plot(1:25, pch = 0:25, cex = 2)


8. مقارنة مع ggplot2

(1) طريقتان لرسم الشكل نفسه

R
# Data
df <- data.frame(x = 1:5, y = c(2, 4, 3, 5, 4))

# Basics R(5 row)
plot(df$x, df$y, type = "b", main = "Trends", xlab = "X", ylab = "Y",
     col = "blue", pch = 19, lwd = 2)

# ggplot2(6 row,**By default, it looks better**)
library(ggplot2)
ggplot(df, aes(x = x, y = y)) +
  geom_line(color = "blue") +
  geom_point(color = "blue", size = 3) +
  labs(title = "Trends", x = "X", y = "Y") +
  theme_minimal()

(2) متى تختار أيهما؟

السيناريو التوصية
نظرة عامة سريعة على البيانات أساسيات لغة R (الرسم البياني باستخدام خط واحد)
المنشورات/الأوراق البحثية ggplot2 (رسوم بيانية بجودة النشر)
دليل تعليمي أساسيات لغة R (بسيطة وسهلة الفهم)
تقرير موحد ggplot2 (السمة الموحدة)
ضبط المعلمات ggplot2 (الضبط الدقيق)


9. مثال كامل: تقرير متعدد الرسوم البيانية حول بيانات المبيعات

فيما يلي مثال على مسار عمل كامل يربط بين جميع المخططات الواردة في هذا الدرس.

▶ مثال: عرض بياني للمبيعات الفصلية في 4 مدن

R
# ============================================
# 4 Visualization of Quarterly City Sales
# Features:6 Comprehensive Display of Basic Charts
# ============================================

# 1. Prepare data
sales <- matrix(c(
  1000, 1200, 1100, 1500,  # Beijing
  1500, 1800, 1700, 2000,  # Shanghai
   800,  900, 1000, 1200,  # Guangzhou
  1200, 1400, 1300, 1600   # Shenzhen
), nrow = 4, byrow = TRUE)
rownames(sales) <- c("Beijing", "Shanghai", "Guangzhou", "Shenzhen")
colnames(sales) <- c("Q1", "Q2", "Q3", "Q4")
print(sales)

# 2. Settings 2x3 Layout
par(mfrow = c(2, 3), mar = c(4, 4, 3, 1))

# 3. Plot 1:Line Chart(4 City)
plot(1:4, sales[1, ], type = "b", col = "red", ylim = c(0, 2500),
     main = "Quarterly Sales Trends", xlab = "Quarter", ylab = "Sales",
     pch = 19, lwd = 2, xaxt = "n")
axis(1, at = 1:4, labels = colnames(sales))
for (i in 2:4) {
  lines(1:4, sales[i, ], type = "b", col = i, pch = 19, lwd = 2)
}
legend("topleft", legend = rownames(sales),
       col = 1:4, pch = 19, lwd = 2, cex = 0.7)

# 4. Plot 2:Bar Chart(Total Sales)
barplot(rowSums(sales),
        main = "Total Sales by City",
        xlab = "City", ylab = "Total Sales",
        col = c("red", "blue", "green", "orange"),
        border = "white")

# 5. Plot 3:Pie Chart(Percentage)
pie(rowSums(sales),
    main = "Share of Sales",
    col = rainbow(4),
    labels = paste0(rownames(sales), "\n", rowSums(sales)))

# 6. Plot 4:Histogram(Sales Distribution)
hist(sales, main = "Sales Distribution", xlab = "Sales",
     col = "lightblue", border = "white", breaks = 10)

# 7. Plot 5:Box-and-Whisker Plot(By City)
boxplot(sales, main = "Quarterly Sales Breakdown by City",
        xlab = "City", ylab = "Sales",
        col = c("red", "blue", "green", "orange"))

# 8. Plot 6:Stacked Bar Chart
barplot(sales, beside = FALSE,  # beside=FALSE → Stacked
        main = "Quarterly Sales Stacked Chart",
        xlab = "City", ylab = "Sales",
        col = c("red", "blue", "green", "orange"),
        legend.text = colnames(sales))

# 9. Restore Layout
par(mfrow = c(1, 1))
▶ جرّب الكود

النتيجة المتوقعة: 6 رسوم بيانية (خطي، عمودي، دائري، هيستوغرام، مخطط صندوقي، وعمودي مكدس) مرتبة في شبكة 2×3.



❓ أسئلة شائعة

س كيف يمكنني حفظ صورة في ملف؟
ج استخدم png() / pdf() / jpeg()، إلخ:
R
png("myplot.png", width = 800, height = 600)
plot(1:10)
dev.off()
س ماذا أفعل إذا كان النص في الشكل مشوّشًا؟
ج أضف par(family = "PingFang SC") (macOS) أو family = "SimHei" (Windows). بالنسبة لنظام Linux، استخدم family = "WenQuanYi Zen Hei". بالنسبة لـ ggplot2، استخدم theme(text = element_text(family = ...)).
س كيف يمكنني إنشاء تخطيط متعدد المخططات؟
جpar(mfrow = c(row, col)) التوزيع المتساوي ② layout(matrix(...)) التخطيط المرن ③ استخدم facet_wrap() في ggplot2 للتجميع حسب (أكثر فعالية).
س هل يمكنني تغيير نمط الرسوم البيانية التي تم إنشاؤها باستخدام لغة R الأساسية؟
ج نعم، لكن الأمر ممل —col lwd pch cex— حيث يتعين عليك تعديل عشرات المعلمات واحدة تلو الأخرى. أما ggplot2 فتستخدم theme() لتطبيق نمط موحد، وهو أسلوب أكثر كفاءة.

📖 ملخص


📝 تمارين

  1. المشكلة الأساسية: قم بإنشاء متجه sales <- c(100, 150, 200, 180, 220)، واستخدم type = "p" و"l" و"b" و"h" لرسم أربعة أشكال (باستخدام par(mfrow = c(2, 2)))، وتحقق من الاختلافات بين الأشكال الأربعة.

  2. تمرين أساسي: استخدم barplot() لإنشاء مخطط مقارنة المبيعات لخمس مدن (بأسماء مخصصة)، وقم بتضمين المعلمات الأربعة col = rainbow(5) وmain وxlab وylab.

  3. تمرين أساسي: استخدم hist() لرسم رسم بياني تكراري لـ 1,000 عدد عشوائي تم توليدها بواسطة rnorm(100, 15)، وأضف المعلمات breaks = 30 وcol = "lightblue"، وتأكد من أن التوزيع يقارب التوزيع الطبيعي.

  4. تمرين متقدم: قم بمحاكاة درجات 4 فصول دراسية، كل منها يضم 10 طلاب (باستخدام list() أو data.frame)، ثم استخدم boxplot() لرسم مخطط بياني لتوزيع الدرجات للفصل 4، مع إضافة الألوان والعنوان.

  5. التحدي: أكمل سير العمل — قم بمحاكاة مصفوفة مبيعات لـ 4 منتجات على مدار 4 أرباع سنوية، واستخدم par(mfrow = c(2, 3)) لإنشاء 6 مخططات: ① مخطط خطي يوضح الاتجاهات، ② مخطط شريطي للمقارنة، ③ مخطط دائري يوضح النسب المئوية، ④ مخطط تكراري يوضح التوزيع، ⑤ مخطط الصندوق والخطوط، ⑥ مخطط شريطي مكدس. وأخيرًا، استخدم png("report.png", 1200, 800) لحفظها في شكل مخطط مركب واحد.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%