תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

12 דברים שאתה חייב לדעת כשאתה מייצר תרשימים באמצעות matplotlib של python

מחבר:
בתאריך:

הצגת נתונים באמצעות תרשימים היא מאוד חשובה כשמנתחים מידע. הספרייה שבה משתמשים הכי הרבה להצגת מידע באמצעות Python היא Matplotlib. במדריך זה תקבלו הצצה לכמה מהמיומנויות היותר חשובות כאשר משתמשים בספרייה.

python matplotlib logo

לחצו להורדת הקוד שאותו נפתח במדריך

 

1. ייבוא הספריות שישמשו במדריך

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
  • מלבד matplotlib כדאי לייבא את %matplotlib inline שמאפשרת לצייר את התרשימים בתוך ה-jupyter notebook ללא פקודה מיוחדת.
  • pandas ישמש לניהול מידע טבלאי (לקריאת המדריך על pandas).

 

2. תרשים פשוט

כדי לצייר תרשים פשוט עם ערכי x ו-y נספק את הרשימות של ערכי x ו-y, לדוגמה:

x = [1.5, 2.33, 3, 4]
y = [5, 6, 9, 13]

נעשה מזה תרשים באמצעות שורה אחת שאליה נעביר את ערכי x ו-y:

plt.plot(x, y)

תרשים פשוט matplotlib

כדאי להוסיף כותרת, שמות עמודות, ושמות הצירים באמצעות הפקודות הבאות:

plt.title("x vs y")
plt.legend(["y"])
plt.xlabel("x")
plt.ylabel("y")

 

3. תרשים פשוט שמשווה בין מספר עמודות

כדי להציג מספר עמודות באותו התרשים:

plt.plot(x, col_name1)
plt.plot(x, col_name2)
# Plot x vs multiple columns
z = [11, 8, 6, 2]
plt.plot(x, y)
plt.plot(x, z)
plt.title("x vs y and z")
plt.legend(["y","z"],  loc="lower left")
plt.xlabel("x")
plt.ylabel("y and z")

תרשים עם מספר עמודות matplotlib

הפרמטר loc שאותו העברנו ל-legend ממקם את המקרא.

כדי להדפיס את התרשים במידה ולא מקפידים על שימוש ב-

%matplotlib inline

צריך להשתמש בפקודה:

plt.show()

 

4. סגנון התרשים

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

כדי לברר את שמות הסגנונות שעומדים לרשותנו:

plt.style.available
['Solarize_Light2',
 '_classic_test_patch',
 'bmh',
 'classic',
 'dark_background',
 'fast',
 'fivethirtyeight',
 'ggplot',
 'grayscale',
 'seaborn',
 'seaborn-bright',
 'seaborn-colorblind',
 'seaborn-dark',
 'seaborn-dark-palette',
 'seaborn-darkgrid',
 'seaborn-deep',
 'seaborn-muted',
 'seaborn-notebook',
 'seaborn-paper',
 'seaborn-pastel',
 'seaborn-poster',
 'seaborn-talk',
 'seaborn-ticks',
 'seaborn-white',
 'seaborn-whitegrid',
 'tableau-colorblind10']

נשתמש בסגנון seaborn:

plt.style.use('seaborn')

כך נראה התרשים מסעיף קודם בסגנון seaborn:

matplotlib seaborn style

הקוד הבא משנה את גודל התרשים עצמו והספרות בתרשים:

params = {'figure.figsize': (16, 12),
          'font.size': 24,
          'axes.titlesize':'xx-large',
          'axes.labelsize': 'large',    
          'xtick.labelsize': 'medium',
          'ytick.labelsize': 'medium'}
plt.rcParams.update(params)

 

5. תרשים שמבוסס על סט נתונים מיובא באמצעות pandas

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

# Plot pandas dataframe 
df = pd.read_csv('../data/height_shoe.csv')

רוצים ללמוד על ספריית pandas? קראו את המדריך.

להורדת סט הנתונים.

נגדיר את עמודת הגובה בתור האינדקס ונציג את המידע:

df.set_index('Height')
df.head()

אנחנו מצפים קורלציה בין גובה למידת הנעל.

df.corr()['Height'].sort_values()
Shoe Size    0.897163
Height       1.000000
Name: Height, dtype: float64

 

5. תרשים פיזור

קורלציה נוח לשרטט באמצעות תרשים פיזור (scatter plot).

plt.plot(df['Height'], df['Shoe Size'], 'o')

תרשים עם מספר עמודות matplotlib

  • פרמטר ראשון הוא ציר ה-x
  • פרמטר שני ציר ה-y
  • 'o' הופך את התרשים לתרשים פיזור

המתודה scatter מאפשרת גם היא להציג תרשים פיזור:

plt.scatter(df['Height'], df['Shoe Size'])

התכונות הבאות מאפשרות שליטה גבוהה יותר במראה:

plt.scatter(df['Height'], df['Shoe Size'], color='red', alpha=.7, marker='+')
  • color - שליטה בצבע
  • alpha - שקיפות בערכים שנעים בין 0 ל-1
  • marker - זו הצורה

דרך נוספת ליצור תרשים פיזור

 

6. הפרדת תרשים הפיזור לאוכלוסיות

נוכל ללמוד יותר על סט הנתונים אם נפריד את הנתונים לזכרים ונקבות.

male   = df[df.gender == 'm']
female = df[df.gender == 'f']

נשרטט את הנתונים אחרי ההפרדה:

plt.plot(male['Height'], male['Shoe Size'], 'bo')
plt.plot(female['Height'], female['Shoe Size'], 'r+')

תרשים פיזור עם הפרדה לקבוצות

את הסגנון השונה של הנקודות הגדרנו באופן הבא:

  • r+ פלוסים בצבע אדום
  • bo נקודות בצבע כחול

וכמו תמיד כדאי להוסיף את התגיות והמקרא:

plt.title("Height vs Shoe size by gender")
plt.legend(["male","female"], loc='lower right')
plt.xlabel("height")
plt.ylabel("shoe size")

 

7. הפרדת תרשימים לתתי תרשימים (subplots)

כדי להשתמש במספר תרשימים ביחד משתמשים בתתי תרשימים (subplots).

הפקודה המשמשת להצגת תתי-תרשימים:

fig, ax = plt.subplots(rows,cols)
  • פרמטר ראשון הוא מספר השורות בתרשים
  • הפרמטר השני הוא מספר העמודות בתרשים

במקרה שלנו אנחנו מעוניינים בשורה אחת עם 2 עמודות. כך עושים את זה:

fig, ax = plt.subplots(1, 2, sharex=True, sharey=True)
  • הקוד מייצר שני תרשימים שלכל אחד מהם ניתן להגדיר תכונות בנפרד.
  • sharex, sharey - מגדיר שלשני התרשימים יהיו אותם צירים.

אבל קודם כל אנחנו צריכים להפריד את 2 האובייקטים שמהם נייצר מיד את התרשימים:

ax1, ax2 = ax

אחרי שעשינו את ההפרדה אנחנו יכולים להגדיר לתרשים הראשון את התכונות שמעניינות אותנו:

ax1.scatter(males.Height, males['Shoe Size'], color='blue', label='Males')

עבור התרשים של הזכרים הגדרנו את סט הנתונים, צירים וצורת הסימונים שיצטרפו ביחד כדי ליצור את הגרף

השורות הבאות מגדירות את הכותרות ואת הצירים:

ax1.set_ylabel('Shoe size')
ax1.set_xlabel('Height')
ax1.legend()
  • השורה ax1.legend() הוסיפה את המקרא.

נחזור על סט ההוראות עבור בנות המין היפה:

ax2.scatter(female.Height, female['Shoe Size'], color='red', marker='+', label='Females')
ax2.set_xlabel('Height')
ax2.legend()

האובייקט fig כולל מתודות המתייחסות לכל הדיאגרמה:

נוסיף כותרת ראשית יפה וגדולה:

fig.suptitle('Height VS Shoe size', fontsize=20, y=1.05)

וההוראה הבאה משפרת את המראה:

fig.tight_layout()

matplotlib subplots

 

הדוגמה הבאה יוצרת טבלה של 3 עמודות על 3 שורות ומשבצת בכל תא תמונה:

import matplotlib.pyplot as plt
# work with images
import matplotlib.image as mpimg

cols = 3
rows = 3
fig, axes = plt.subplots(rows, cols, sharex=True, sharey=True, figsize=(14, 14))
for i, ax in enumerate(axes.flat):
    # load and show image
    img = mpimg.imread(f'./digits/{i+1}.png')
    ax.imshow(img, cmap="gray")
    # hide ticks
    ax.set_xticks([])
    ax.set_yticks([])
    # set label
    ax.set_xlabel(f'{i+1}', fontsize = 40)

matplotlib subplots 3X3 grid

 

8. דיאגרמת מקלות

:כדי לייצר דיאגרמת מקלות נשתמש בפקודה

plt.bar(x, y)
  • x - הוא ציר ה-x
  • y - הוא ציר ה-y

:הדיאגרמה הבאה מתארת את מחירם של דגמים של מכוניות

companies = ['Audi','Ferrari','BMW','Mazda','Tesla']
prices = [200000,500000,180000,145000,195000]
import numpy as np
xpos = np.arange(len(companies))
plt.title("Car prices")
plt.xlabel("Compnaies")
plt.ylabel("Prices")

plt.bar(xpos, prices)
plt.xticks(xpos, companies)
plt.legend()

bar chart with matplotlib

  • מיד נסביר את סיבת השימוש במערך numpy בשביל ציר ה-x.
  • הפקודה xticks ממפה לכל נקודה על ציר ה-x את שם החברה.

מאוד מקובל להשתמש בדיאגרמת מקלות כדי להשוות בין שתי סדרות של נתונים. אז נוסיף סדרת נתונים נוספת:

taxes = [100000,120000,60000,45000,69000]

נוסיף גם אותה לתרשים:

plt.title("Car prices and taxes")
plt.xlabel("Compnaies")
plt.ylabel("Prices")

plt.bar(xpos+0.2, prices, width=0.4, label="Prices")
plt.bar(xpos-0.2, taxes, width=0.4, label="Taxes")

plt.xticks(xpos, companies)
plt.legend()
  • הודות לשימוש במערך numpy הוספנו והפחתנו מהערכים על ציר ה-x וכך הפרדנו את הסדרות .
  • הרוחב הוא כפול ממידת ההזזה וכך קיבלנו את הקיבוץ של הנתונים לפי חברות.

bar chart with matplotlib and 2 data serieses

אפשר להציג את התרשים כשהעמודות ממוקמות אופקית.

plt.title("Car prices and taxes")
plt.ylabel("Compnaies")
plt.xlabel("Prices")

plt.barh(xpos, prices, label="Prices")
plt.barh(xpos, taxes, label="Taxes")

plt.yticks(xpos, companies)
plt.legend()

horizontal bar chart with matplotlib

  • במקום בפקודה bar השתמשנו ב-barh.
  • הפכנו את התגיות על הצירים
  • במקום xticks השתמשנו ב-yticks.

 

9. הצגת שכיחויות באמצעות היסטוגרמה

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

male['Height'].plot(kind='hist', bins=4, alpha=.6, color='blue')
female['Height'].plot(kind='hist', bins=4, alpha=.6, color='red')

היסטוגרמה באמצעות matplotlib

  • bins - לכמה קבוצות משנה לחלק
  • alpha - נותן שקיפות מה שעוזר לנו כשאנחנו רוצים לראות את הנתונים החופפים בין הקבוצות

כדאי להוסיף תגיות:

plt.xlabel("height")
plt.legend(["male","female"])

 

10. הצגת התפלגויות ומדדי מרכז באמצעות boxplot

דרך מצוינת ללמוד על התפלגות ומדדי מרכז (ממוצע, חציון, רבעונים) היא באמצעות המתודה describe של pandas.

male.describe()

וכדי לשרטט את זה אפשר להשתמש ב-boxplot.

א. ניצור רשימה אחת שמקבצת את הגובה של גברים ונשים:

data_to_plot = [male['Height'], female['Height']]

ב. ניצור תת-תרשים עם צירי x, y משותפים:

fig, ax = plt.subplots(1, 1, sharex=True, sharey=True)

ג. נצייר את ה-boxplot:

bp = ax.boxplot(data_to_plot)

ד. נקבע את התגיות של הצירים

ax.set_xticklabels(["Male", "Female"])
plt.ylabel("height")

הצגת התפלגויות ומדדי מרכז באמצעות boxplot

 

11. הצגת פרופורציות באמצעות תרשים עוגה

כדי להציג את הפרופורציות בתוך האוכלוסיה נשתמש בתרשים עוגה (pie chart).

א. נמצא את השכיחות של זכרים ונקבות ונאסוף את השכיחויות לתוך רשימה:

counts = [male.shape[0], female.shape[0]]

ב. נגדיר את התגיות:

labels = ['males', 'females']

ג. נצייר את התרשים:

plt.pie(counts, labels=labels)

כדי לשפר את התרשים:

plt.pie(counts, labels=labels, 
          autopct="%0.2f%%", 
          explode=[0, 0.1], 
          startangle=90)
  • autopct - 2 ספרות משמעותיות אחרי הנקודה
  • explode - מרחיק את חתיכות העוגה. במקרה זה הרחקתי את החתיכה השנייה.
  • startangle - מסובב את התרשים.

תרשים עוגה באמצעות matplotlib

 

12. כיצד לייצא את התרשים לתמונה

כדי לייצא את התרשים לתמונה:

plt.savefig('piechart.png', bbox_inches='tight')

bbox_inches - נפטר מהשוליים הלבנים סביב התמונה.

 

13. תרשים בצורת בייגלה Donut Chart

בשביל תרשים בייגלה Donut Chart נשתמש בתרשים pie כמו בסעיף הקודם שנשנה לו מספר פרמטרים ברירת מחדל.

נגדיר את הקטגוריות ואת החלק היחסי של כל קטגוריה:

# Data for the donut chart
sizes = [4, 21, 41, 34]
labels = ['Other', 'Pricey', 'Reasonable', 'Underpriced']
colors = ['#0064B1'] * len(sizes)  # All slices have the same color
explode = [0.01] * len(sizes)  # Offset for each wedge
  • explode מגדיר את הרווח בין החלקים שמצטרפים ליצירת הפאי.

נגדיר את המתודה pie() עם כמה פרמטרים:

# Create a donut chart
fig, ax = plt.subplots()
ax.pie(sizes, 
        labels=labels, 
        colors=colors, 
        explode=explode,
        wedgeprops={'width': 0.1, 'linewidth': 2, 'edgecolor': 'white'},
        autopct='%1.1f%%', 
        textprops={'fontsize': 12, 'color': '#504e4f'})
  • wedgeprops מגדיר את השטח שיתפוס החור של הבייגלה ואת המרווחים בין חלקי הפאי.
  • textprops מגדיר את תכונות הכיתוב.

יצוא התרשים בפורמט של svg:

# Save the plot as SVG file
plt.savefig('donut_chart.svg', format='svg')

להצגת התרשים:

# Show the plot
plt.show()

התוצאה:

donut chart created with Matplotlib python library

 

מומלץ לך לקרוא גם את המדריך: 7 דרכים ליצירת תרשימים אטרקטיביים ומשוכללים באמצעות seaborn ופייתון שמלמד כיצד לייצר תרשימים משוכללים ביתר קלות.

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?

השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

מהם שלוש רשויות השלטון בישראל?

 

תמונת המגיב

לומדת בתאריך: 06.05.2020

תודה על המדריך המעניין והברור!
עזר לי מאד
סעיף לא עובד אצלי, מציג 2 תרשימים בזה אחר זה במקום תרשים
אחד המאחד את האוכלוסיות. מה יכול להיות שקרה?

תמונת המגיב

בת 7 בתאריך: 17.07.2022

וואו לימד אותי בטרוף!!! תודה רבה!

תמונת המגיב

רות בתאריך: 16.05.2023

המקום הכי טוב כדאי ללמוד מוסבר יפה מאוד ועוזר מאוד

תמונת המגיב

חיים מוהבי בתאריך: 23.10.2024

תודה רבה יא מלך