اذهب إلى المحتوى
  • 0

رسم هيستوغرام (Histogram) في بايثون باستخدام Matplotlib | بايثون

Ali Ismael

السؤال

لدي مجموعة من البيانات وأريد رسم الهستوغرام لها في Matplotlib فهل هناك دالة أو طريقة للقيام بذلك في هذه المكتبة؟

تم التعديل في بواسطة Ali Ismael
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

لرسم هيستوغرام يمكنك استخدام الدالة hist في Matplotlib:

matplotlib.pyplot.hist(x, bins=None, range=None, density=False,
                       histtype='bar',align='mid', orientation='vertical',
                       color=None, label=None, stacked=False,
                       data=None, **kwargs)

ولإنشاء هيستوغرام (مدرج تكراري)، فإن الخطوة الأولى هي إنشاء حاوية للنطاقات أو المجالات " bin of the ranges "، ثم توزيع النطاق الكامل للقيم في سلسلة من الفواصل الزمنية، وإحصاء القيم التي تقع في كل من الفواصل الزمنية. أي بمعنى أوضح مثلاً في حالة لديك صورة رمادية فإن السويات اللونية والتي تمثل المحور الأفقي تكون من 0 ل255 وتريد معرفة عدد مرات تكرار كل سوية لونية في الصورة (كم بكسل في الصورة يحمل هذه القيمة) ولسبب ما تريد أن تقسم هذا السويات إلى نطاقات (مجالات) مثلاً تريد تقسيمها إلى 64 مجال بحيث كل مجال يحوي 4 سويات لونية. وبالتالي نكون هنا قد حددنا الحاويات وتبقى لنا أن نقوم بإحصاء البكسلات التي تنتمي إلى كل حاوية من هذه الحاويات.
الآن بالعودة للوسطاء فإن أول وسيط يمثل المصفوفة التي نريد حساب هستوغرامها (قد تمثل صورة أو أياً كان)، والوسيط الثاني bins هو عدد صحيح يمثل عدد الحاويات، أما range فيحدد القيمة الدنيا والعليا لل bins. أما density   فهي قيمة منطقية، ويؤدي تفعيلها لرسم كثافة احتمالية وسيتم إرجاعها من الدالة، وهنا ستعرض كل حاوية العدد الأولي للحاوية مقسوماً على العدد الإجمالي للأعداد وعرض الحاوية:

(density = counts / (sum(counts) * np.diff(bins)))

بحيث تتكامل المنطقة الموجودة أسفل المدرج التكراري مع 1:

(np.sum(density * np.diff(bins)) == 1)

وإذا كان stacked مفعلاً أيضاً، فسيتم تسوية (normalized) مجموع الرسوم البيانية إلى 1.  أما الوسيط histtype فهو يحدد نوع الرسم البياني المراد رسمه {'bar', 'barstacked', 'step', 'stepfilled'} وافتراضياً يكون bar، وهو الرسم بياني التقليدي (أشرطة أو أعمدة). بحيث  يتم ترتيب الأشرطة جنباً إلى جنب.  والنوع الثاني barstacked وهو مدرج تكراري من نوع شريط bar حيث يتم تكديس العديد من البيانات فوق بعضها البعض.أما النوع step مخطط خطي غير معبأ بشكل افتراضي. وأخيراً stepfilled يولد مخطط خطي معبأ بشكل افتراضي.  أما الوسيط align فيحدد المحاذاة الأفقية لأشرطة الرسم البياني. "left": تتركز الأشرطة على حواف الحاوية اليسرى. "mid": تتمركز الأشرطة بين حواف الحاوية. "right": تتركز الأشرطة على حواف الحاوية اليمنى. أما orientation فقيمه هي {'vertical', 'horizontal'}، فإذا كان "أفقياً" ، فسيتم استخدام barh -أي bar لكن معكوس- للمخططات البيانية من النوع الشريطي وسيكون kwarg السفلي هو الحواف اليسرى. أما ال color فهو لتحديد اللون. وأخيراً ففي حالة التغعيل True فسيتم تكديس بيانات فوق بعضها البعض. أما في حال عدم التفعيل False فيتم ترتيب البيانات المتعددة جنباً إلى جنب إذا كان نوع هيست هو "bar" أو فوق بعضها البعض إذا كان النوع هو "step".
مثال 1: سنقوم بتوليد بيانات عشوائية ثم سنقوم بعرض هستوغرامها:

import matplotlib.pyplot as plt
import numpy as np
x = np.random.normal(170, 10, 250)
plt.hist(x)
plt.show() 

الخرج:
img_matplotlib_histogram1.png.e634f296af37420bd2ebf1dc97ab3fe3.png
مثال2:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
from matplotlib.ticker import PercentFormatter
# إنشاء بيانات عشوائية 
N_points = 984
n_bins = 15
# إنشاء توزيع
x = np.random.randn(N_points)
y = .8 ** x + np.random.randn(984) + 25
legend = ['distribution']
# إنشاء الهيستوغرام
fig, axs = plt.subplots(1, 1,
						figsize =(10, 7),
						tight_layout = True)
#ticks حذف العلامات 
axs.xaxis.set_ticks_position('none')
axs.yaxis.set_ticks_position('none')
# إضافة شبكة إلى الخلفية
axs.grid(b = True, color ='grey',
		linestyle ='-.', linewidth = 0.5,
		alpha = 0.6)
# إضافة نص للشكل
fig.text(0.9, 0.15, 'Ali Haidar Ahmad',
		fontsize = 13,color ='red',ha ='right',
		va ='top',alpha = 0.7)
# plot حذف خطوط حاويةال 
for s in ['top', 'bottom', 'left', 'right']:
	axs.spines[s].set_visible(False)
#وضع مسافة بين التسميات وبين المحاور
axs.xaxis.set_tick_params(pad = 4)
axs.yaxis.set_tick_params(pad = 8)
# إنشاء الهستوغرام
N, bins, patches = axs.hist(x, bins = n_bins)
# تحديد الألوان
fracs = ((N**(9)) / N.max())
norm = colors.Normalize(fracs.min(), fracs.max())
for thisfrac, thispatch in zip(fracs, patches):
	color = plt.cm.viridis(norm(thisfrac))
	thispatch.set_facecolor(color)
# تسمية للمحاور
plt.xlabel("X-axis")
plt.ylabel("y-axis")
plt.legend(legend)
# عنوان
plt.title('Hsoub')
# عرض
plt.show()

الخرج:
index.png.43b42c0de0eab0f8d86b1af3d7d7f545.png

مثال 3:

import matplotlib.pyplot as plt
import cv2
# قراءة صورة
im = cv2.imread('/content/closedeye1.jpg')
# نقوم بتسطيح الصورة لتصبح أحادية الأبعاد
vals = im.flatten()
# هنا كونك تريد أن تقوم برسم هيستوغرام صورة فيجب أن تضع عدد الحاويات على 255 إلا إذا كنت تريد شيئاً آخر
# 255 = bins
plt.hist(vals, 255)
plt.xlim([0,255])
plt.show()

الخرج:
1.png.1d3d0f78258c54d6393e8e3d38701ee3.png

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

الطريقة العامة لرسم histogram في بايثون سهلة وهي كالتالي:

import matplotlib.pyplot as plt

x = [value1, value2, value3,....]
plt.hist(x, bins = number of bins)
plt.show()

حيث أن x هي البيانات التي نريد رسمها بينما bins هي عدد الخانات التي نريد أن تكون فيها البيانات، أنظر المثال التالي:
 

import matplotlib.pyplot as plt
 
x = [1,1,2,3,3,5,7,8,9,10,
     10,11,11,13,13,15,16,17,18,18,
     18,19,20,21,21,23,24,24,25,25,
     25,25,26,26,26,27,27,27,27,27,
     29,30,30,31,33,34,34,34,35,36,
     36,37,37,38,38,39,40,41,41,42,
     43,44,45,45,46,47,48,48,49,50,
     51,52,53,54,55,55,56,57,58,60,
     61,63,64,65,66,68,70,71,72,74,
     75,77,81,83,84,87,89,90,90,91
     ]

plt.hist(x, bins=10)
plt.show()

وتكون الرسمة كالتالي:
001_hist.png.e4a70d3aa87a64ed7ab913e78dd7dbee.png

ويمكنك تغيير شكل الرسمة عن طريق plt.style.use كالتالي:

import matplotlib.pyplot as plt
 
x = [1,1,2,3,3,5,7,8,9,10,
     10,11,11,13,13,15,16,17,18,18,
     18,19,20,21,21,23,24,24,25,25,
     25,25,26,26,26,27,27,27,27,27,
     29,30,30,31,33,34,34,34,35,36,
     36,37,37,38,38,39,40,41,41,42,
     43,44,45,45,46,47,48,48,49,50,
     51,52,53,54,55,55,56,57,58,60,
     61,63,64,65,66,68,70,71,72,74,
     75,77,81,83,84,87,89,90,90,91
     ]

plt.style.use('ggplot')
plt.hist(x, bins=10)
plt.show()

وتظهر بشكل مختلف هكذا:

002_hist.png.b02767c77aa03e7c6fa1f564afc2d71a.png

ويمكنك تغيير الشكل واللون بأشكال مختلفة.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...