Matplotlib Scatter

نمودار پراکنده

برای رسم یک نمودار پراکنده از تابع scatter() استفاده می‌کنیم.

این تابع برای هر مشاهده یک نقطه رسم می‌کند. به دو آرایه هم اندازه نیاز دارد، یکی برای مقادیر محور x و دیگر برای مقادیر محور y.


import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])

plt.scatter(x, y)
plt.show()

خروجی:

مشاهدات مثال بالا در مورد 13 ماشینی عبوری است.

محور x سن ماشین را نشان می‌دهد.

محور y سرعتی که ماشین عبور کرده است را نشان می‌دهد.

آیا هیچ ارتباطی بین مشاهدات ما وجود دارد؟

به نظر می‌رسد که هر چه ماشین جدیدتر باشد سرعتش بیشتر است. ولی این ممکن است تنها یک اتفاق باشد و ما تنها 13 داده را ثبت کرده‌ایم.

مقایسه نمودارها

در مثال بالا به نظر می‌رسد که بین سن و سرعت ماشین ارتباطی وجود دارد ولی اگر داده‌ها را برای یک روز دیگر رسم کنیم چطور؟ آیا نمودار پراکنده چیز دیگری به ما خواهد گفت؟


import matplotlib.pyplot as plt
import numpy as np

#day one, the age and speed of 13 cars:
x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
plt.scatter(x, y)

#day two, the age and speed of 15 cars:
x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
plt.scatter(x, y)

plt.show()

خروجی:

با مقایسه دو نمودار به نظر می‌رسد می‌توان گفت که هر دو یک نتیجه را می‌دهند: ماشین‌های جدیدتر سریعتر عبور می‌کنند.

رنگ‌ها

می‌توانید رنگ دلخواه خود را برای هر نمودار پراکنده بوسیله آرگومان color یا c تعیین کنید.


import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
plt.scatter(x, y, color = 'hotpink')

x = np.array([2,2,8,1,15,8,12,9,7,3,11,4,7,14,12])
y = np.array([100,105,84,105,90,99,90,95,94,100,79,112,91,80,85])
plt.scatter(x, y, color = '#88c999')

plt.show()

خروجی:

رنگ مجزا برای هر نقطه

حتی می‌توان برای هر نقطه مشاهده در نمودار یک رنگ مجزا انتخاب کرد. تنها کافی است مجموعه‌ای از رنگ‌ها را به صورت یک آرایه به آرگومان c بدهید.

توجه داشته باشید در این حالت تنها باید از آرگومان c استفاده کرد و آرگومان color را نمی‌توان به کار برد.

import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
colors = np.array(["red","green","blue","yellow","pink","black","orange","purple",
                    "beige","brown","gray","cyan","magenta"])

plt.scatter(x, y, c=colors)

plt.show()

خروجی:

ColorMap

راهنمای رنگ یا ColorMap مانند یک لیست از رنگ‌ها است که هر رنگ مقدار خاص خود را دارد.

Matplotlib دارای راهنماهای رنگ بسیار زیادی است. در زیر یک نمونه از آن را که به اسم 'viridis' مشهور است، نشان داده‌ایم. در این راهنمای رنگ، پایین‌ترین مقدار به رنگ بنفش و بالاترین مقدار به رنگ زرد اختصاص داده شده است.

چگونه از راهنمای رنگ استفاده کنیم؟

می‌توانید با استفاده از آرگومان cmap نوع colormap را مشخص و سپس با استفاده از دستور plt.colorbar() آن را در شکل نمودار وارد کنید.


import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
colors = np.array([0, 10, 20, 30, 40, 45, 50, 55, 60, 70, 80, 90, 100])

plt.scatter(x, y, c=colors, cmap='viridis')

plt.show()

خروجی:

اندازه

برای تغییر اندازه نقاط می‌توانید از آرگومان s استفاده کنید.

دقیقاً مانند آرگومان c اینجا هم باید طول آرایه اندازه نقاط با طول نقاط x و y همخوانی داشته باشد.


import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
sizes = np.array([20,50,100,200,500,1000,60,90,10,300,600,800,75])

plt.scatter(x, y, s=sizes)

plt.show()

خروجی:

Alpha

با استفاده از آرگومان alpha می‌توانید شفافیت هر نقطه را تعیین کنید.


import matplotlib.pyplot as plt
import numpy as np

x = np.array([5,7,8,7,2,17,2,9,4,11,12,9,6])
y = np.array([99,86,87,88,111,86,103,87,94,78,77,85,86])
sizes = np.array([20,50,100,200,500,1000,60,90,10,300,600,800,75])

plt.scatter(x, y, s=sizes, alpha=0.5)

plt.show()

خروجی:

ترکیب رنگ، اندازه و آلفا

مشاهده شد که می‌توان برای هر نقطه یک اندازه متفاوت در نظر گرفت. این کار زمانی بهترین نتیجه را حاصل می‌کند که نقاط به صورت شفاف باشند.


import matplotlib.pyplot as plt
import numpy as np

x = np.random.randint(100, size=(100))
y = np.random.randint(100, size=(100))
colors = np.random.randint(100, size=(100))
sizes = 10 * np.random.randint(100, size=(100))

plt.scatter(x, y, c=colors, s=sizes, alpha=0.5, cmap='nipy_spectral')

plt.colorbar()

plt.show()

خروجی: