12 דברים שאתה חייב לדעת כשאתה מייצר תרשימים באמצעות matplotlib של python
הצגת נתונים באמצעות תרשימים היא מאוד חשובה כשמנתחים מידע. הספרייה שבה משתמשים הכי הרבה להצגת מידע באמצעות Python היא Matplotlib. במדריך זה תקבלו הצצה לכמה מהמיומנויות היותר חשובות כאשר משתמשים בספרייה.
לחצו להורדת הקוד שאותו נפתח במדריך
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)
כדאי להוסיף כותרת, שמות עמודות, ושמות הצירים באמצעות הפקודות הבאות:
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")
הפרמטר 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:
הקוד הבא משנה את גודל התרשים עצמו והספרות בתרשים:
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')
- פרמטר ראשון הוא ציר ה-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()
הדוגמה הבאה יוצרת טבלה של 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)
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()
- מיד נסביר את סיבת השימוש במערך 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 וכך הפרדנו את הסדרות .
- הרוחב הוא כפול ממידת ההזזה וכך קיבלנו את הקיבוץ של הנתונים לפי חברות.
אפשר להציג את התרשים כשהעמודות ממוקמות אופקית.
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()
- במקום בפקודה 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')
- 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")
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 - מסובב את התרשים.
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()
התוצאה:
מומלץ לך לקרוא גם את המדריך: 7 דרכים ליצירת תרשימים אטרקטיביים ומשוכללים באמצעות seaborn ופייתון שמלמד כיצד לייצר תרשימים משוכללים ביתר קלות.
לכל המדריכים בנושא של למידת מכונה
אהבתם? לא אהבתם? דרגו!
0 הצבעות, ממוצע 0 מתוך 5 כוכבים
המדריכים באתר עוסקים בנושאי תכנות ופיתוח אישי. הקוד שמוצג משמש להדגמה ולצרכי לימוד. התוכן והקוד המוצגים באתר נבדקו בקפידה ונמצאו תקינים. אבל ייתכן ששימוש במערכות שונות, דוגמת דפדפן או מערכת הפעלה שונה ולאור השינויים הטכנולוגיים התכופים בעולם שבו אנו חיים יגרום לתוצאות שונות מהמצופה. בכל מקרה, אין בעל האתר נושא באחריות לכל שיבוש או שימוש לא אחראי בתכנים הלימודיים באתר.
למרות האמור לעיל, ומתוך רצון טוב, אם נתקלת בקשיים ביישום הקוד באתר מפאת מה שנראה לך כשגיאה או כחוסר עקביות נא להשאיר תגובה עם פירוט הבעיה באזור התגובות בתחתית המדריכים. זה יכול לעזור למשתמשים אחרים שנתקלו באותה בעיה ואם אני רואה שהבעיה עקרונית אני עשוי לערוך התאמה במדריך או להסיר אותו כדי להימנע מהטעיית הציבור.
שימו לב! הסקריפטים במדריכים מיועדים למטרות לימוד בלבד. כשאתם עובדים על הפרויקטים שלכם אתם צריכים להשתמש בספריות וסביבות פיתוח מוכחות, מהירות ובטוחות.
המשתמש באתר צריך להיות מודע לכך שאם וכאשר הוא מפתח קוד בשביל פרויקט הוא חייב לשים לב ולהשתמש בסביבת הפיתוח המתאימה ביותר, הבטוחה ביותר, היעילה ביותר וכמובן שהוא צריך לבדוק את הקוד בהיבטים של יעילות ואבטחה. מי אמר שלהיות מפתח זו עבודה קלה ?
השימוש שלך באתר מהווה ראייה להסכמתך עם הכללים והתקנות שנוסחו בהסכם תנאי השימוש.