Menu

תרשים עמודות ב-R: barplot() מספירות ומטבלאות

איך יוצרים תרשים עמודות ב-R עם barplot(): מווקטור עם שמות או מ-table(), עמודות מקובצות ומוערמות ממטריצה, עיצוב, ו-geom_col מול geom_bar.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

תרשימי עמודות משווים בין קטגוריות

תרשים עמודות עונה על השאלה "כמה מכל אחד?": עמודה אחת לכל קטגוריה, ואורך העמודה מראה את הערך שלה. ב-R הפונקציה הבסיסית היא barplot(), והקלט שלה הוא פשוט וקטור של גבהים. תנו לווקטור שמות, והשמות יהפכו לתוויות מתחת לעמודות:

visits <- c(Mon = 42, Tue = 51, Wed = 47, Thu = 60, Fri = 78)

barplot(visits,
        main = "Store visits by day",
        ylab = "Visits")

חמש עמודות אפורות, עם תווית לכל יום, שמטפסות מיום שני צנוע ועד שיא ביום שישי, גבוה כמעט פי שניים. אין מה להתקין ואין מה להגדיר: אם אתם יודעים לבנות וקטור עם שמות, אתם יכולים לשרטט אותו.

העורכים שאפשר להריץ בעמוד הזה מציגים פלט טקסט בלבד, ולכן הקריאות ל-barplot() כאן הן קטעי קוד סטטיים להדבקה בסשן R מקומי. אבל שלב הספירה שלפניהן רץ בלי בעיה, והוא השלב החשוב ביותר.

תהליך העבודה האמיתי: קודם table(), אחר כך barplot()

בפועל נדיר שיש לכם גבהים מסודרים שכבר נספרו. יש לכם עמודה גולמית של תוויות קטגוריה, שורה אחת לכל תשובה בסקר, לכל הזמנה, לכל משתמש, והספירה היא העבודה עצמה. table() עושה אותה בקריאה אחת, והפלט שלה הוא וקטור של ספירות עם שמות, בדיוק מה ש-barplot() רוצה:

ואז התרשים הוא עוד שורה אחת:

barplot(sort(t, decreasing = TRUE),
        main = "Survey responses",
        ylab = "Count")

שני השלבים האלה, table() ואז barplot(), הם תהליך תרשים העמודות הנפוץ ביותר ב-R. מיון הטבלה קודם הוא שדרוג זול: עמודות שממוינות לפי גובה נקראות מהר יותר מעמודות בסדר אלפביתי, אלא אם לקטגוריות יש סדר טבעי (ימים, חודשים, רמות מינון), ואז factor עם רמות בסדר הנכון מונע מ-table() למיין אותן לפי האלף-בית. לעמודות שדורשות צבירה אמיתית, סכומים או ממוצעים לכל קבוצה ולא ספירת שורות, בצעו קודם את שלב ה-group-by-summarize והעבירו ל-barplot() את התוצאה.

תוויות ועיצוב

התוויות מגיעות בדרך כלל משמות הווקטור, אבל names.arg דורס אותן, וזה שימושי כשהקודים בנתונים לא מתאימים לקהל:

barplot(visits,
        names.arg = c("Monday", "Tuesday", "Wednesday",
                      "Thursday", "Friday"),
        col    = "steelblue",
        border = NA,
        main   = "Store visits by day",
        las    = 2)
  • col ממלא את העמודות; העבירו וקטור כדי לצבוע כל עמודה בנפרד, אבל אל תתפתו לקשת צבעים כברירת מחדל: לצבע צריכה להיות משמעות, למשל סימון העמודה האחת שעליה אתם מדברים.
  • border = NA מסיר את קווי המתאר של העמודות למראה נקי יותר.
  • las = 2 מסובב את תוויות הציר כך שיהיו ניצבות לציר, וזה הפתרון לשמות קטגוריה ארוכים שעולים זה על זה. שלבו אותו עם שוליים תחתונים גדולים יותר (par(mar = c(8, 4, 4, 2))) אם השמות באמת ארוכים.

עמודות מקובצות ומוערמות ממטריצה

כדי להציג שני ממדים קטגוריאליים בבת אחת, למשל מכירות לפי ערוץ ולפי רבעון, העבירו ל-barplot() מטריצה. כל עמודה במטריצה הופכת למיקום אחד על ציר הקטגוריות, והשורות הופכות לעמודות המשנה:

sales <- matrix(c(12, 18,   15, 22,   20, 19,   24, 27),
                nrow = 2,
                dimnames = list(c("Online", "Retail"),
                                c("Q1", "Q2", "Q3", "Q4")))

# Grouped: rows stand next to each other within each quarter
barplot(sales, beside = TRUE,
        col = c("steelblue", "orange"),
        legend.text = rownames(sales),
        main = "Sales by channel and quarter")

# Stacked: rows pile up into one total bar per quarter (the default)
barplot(sales, beside = FALSE,
        col = c("steelblue", "orange"),
        legend.text = rownames(sales))

beside = TRUE מציב את שני הערוצים כתף אל כתף בתוך כל רבעון, וזה הכי טוב כשרוצים להשוות בין הערוצים ישירות. ברירת המחדל המוערמת מדגישה את הסך הכול לכל רבעון, והחלוקה מוצגת בתוך כל עמודה; היא הוגנת לגבי סכומים, אבל קשה להשוות בה את המקטעים הפנימיים בין עמודות, כי קו הבסיס שלהם זז. legend.text = rownames(sales) מוסיף את המקרא שהופך כל אחת מהגרסאות לקריאה.

עוד מתג אחד: horiz = TRUE פורש את העמודות לאורך הציר האופקי. זו הפריסה הנוחה ביותר להרבה קטגוריות עם שמות ארוכים: כל תווית יושבת בשורה משלה ליד העמודה שלה, בלי צורך בסיבוב.

תרשים עמודות או היסטוגרמה?

אנשים מתבלבלים ביניהם כל הזמן, וההבחנה שווה שלושים שניות: תרשים עמודות משווה בין קטגוריות נפרדות: הציר הוא אוסף של תוויות, העמודות מופרדות, ומותר לשנות את הסדר שלהן. היסטוגרמה מחלקת משתנה מספרי אחד למקטעים: הציר הוא סקאלה רציפה, העמודות נוגעות זו בזו כי המקטעים הם טווחים רצופים, ושינוי הסדר שלהן יהיה חסר משמעות. אם העמודה שלכם מכילה מילים ("Yes", "Chrome", "Q3"), אתם צריכים barplot(table(x)). אם היא מכילה מדידות (גבהים, מחירים, זמני תגובה), אתם צריכים היסטוגרמה ו-hist(x).

ggplot2: geom_col מול geom_bar

הגרסה של ggplot2 מגיעה בשני geoms, לפי השאלה אם הספירה כבר בוצעה:

library(ggplot2)

# geom_bar(): raw observations in, counting done for you
ggplot(survey, aes(x = response)) +
    geom_bar(fill = "steelblue")

# geom_col(): heights already computed, one row per bar
totals <- data.frame(day = c("Mon", "Tue", "Wed", "Thu", "Fri"),
                     visits = c(42, 51, 47, 60, 78))

ggplot(totals, aes(x = day, y = visits)) +
    geom_col(fill = "steelblue")

geom_bar() היא table() שמובנית בתוך הגרף: היא מקבלת שורה אחת לכל תצפית וסופרת. geom_col() מקבלת נתונים שכבר נצברו וממפה עמודת y לגובה העמודה, המקבילה ל-barplot() הקלאסית. הזנת נתונים שכבר נספרו ל-geom_bar() היא מלכודת המתחילים הסטנדרטית: היא סופרת את השורות (אחת לכל אחת) וכל העמודות יוצאות באותו גובה.

מה לקחת מכאן

  • barplot(heights) משרטטת וקטור עם שמות, ו-table(x) מייצרת בדיוק את הצורה הזו מנתוני קטגוריה גולמיים, ולכן barplot(table(x)) הוא הביטוי המרכזי.
  • מיינו את הטבלה (או הגדירו רמות factor) לפני השרטוט; סדר העמודות הוא חלק מהמסר.
  • מטריצה נותנת עמודות מקובצות (beside = TRUE) או מוערמות (ברירת המחדל); הוסיפו legend.text = rownames(m).
  • names.arg, col, las = 2 ו-horiz = TRUE מטפלים בתוויות; עמודות אופקיות הן הטובות ביותר לשמות ארוכים.
  • קטגוריות → תרשים עמודות; מקטעים מספריים → היסטוגרמה. ב-ggplot2: שורות גולמיות → geom_bar(), גבהים מחושבים → geom_col().

הבא בתור: ggplot2 עצמה, הדקדוק שבונה את כל התרשימים האלה, ועוד רבים אחרים, מאותם כמה רכיבים שאפשר להרכיב יחד.

שאלות נפוצות

איך יוצרים תרשים עמודות ב-R?

קוראים ל-barplot() עם וקטור של גבהים. תנו לווקטור שמות, או בנו אותו עם table(), שהפלט שלה כבר כולל שמות, וכל איבר יהפוך לעמודה אחת עם תווית: barplot(table(df$category)).

איך יוצרים barplot מקובץ או מוערם ב-R?

מעבירים מטריצה. כל עמודה במטריצה הופכת למיקום אחד על ציר הקטגוריות; beside = TRUE מצייר את השורות כעמודות שעומדות זו לצד זו (מקובץ), וברירת המחדל beside = FALSE מערימה אותן. הוסיפו legend.text = rownames(m) כדי שהקוראים יוכלו להבחין בין השורות.

מה ההבדל בין barplot() ל-hist() ב-R?

barplot() משווה בין קטגוריות נפרדות: עמודה אחת לכל קטגוריה, והעמודות מופרדות. hist() מחלקת משתנה מספרי אחד למקטעים רצופים: העמודות נוגעות זו בזו כי הציר הוא סקאלה רציפה. אם המשתנה שלכם הוא מילים, אתם צריכים barplot(table(x)); אם הוא מספרים, אתם צריכים hist(x).

האם להשתמש ב-geom_bar או ב-geom_col ב-ggplot2?

geom_bar() סופרת בשבילכם: תנו לה תצפיות גולמיות והיא סוכמת כל קטגוריה. geom_col() מציירת ערכים שכבר חישבתם: תנו לה שורה אחת לכל עמודה ועמודת גובה. נתונים שכבר נספרו עם geom_bar() הם הטעות הקלאסית; הם צריכים geom_col().

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל