Ali Ismael نشر 11 أكتوبر 2021 أرسل تقرير نشر 11 أكتوبر 2021 (معدل) لدي مجموعة من البيانات وأريد رسم الهستوغرام لها في Matplotlib فهل هناك دالة أو طريقة للقيام بذلك في هذه المكتبة؟ تم التعديل في 11 أكتوبر 2021 بواسطة Ali Ismael 1 اقتباس
1 Ali Haidar Ahmad نشر 11 أكتوبر 2021 أرسل تقرير نشر 11 أكتوبر 2021 لرسم هيستوغرام يمكنك استخدام الدالة 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() الخرج: مثال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() الخرج: مثال 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 اقتباس
0 Ahmed Sharshar نشر 16 أكتوبر 2021 أرسل تقرير نشر 16 أكتوبر 2021 الطريقة العامة لرسم 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() وتكون الرسمة كالتالي: ويمكنك تغيير شكل الرسمة عن طريق 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() وتظهر بشكل مختلف هكذا: ويمكنك تغيير الشكل واللون بأشكال مختلفة. اقتباس
السؤال
Ali Ismael
لدي مجموعة من البيانات وأريد رسم الهستوغرام لها في Matplotlib فهل هناك دالة أو طريقة للقيام بذلك في هذه المكتبة؟
تم التعديل في بواسطة Ali Ismael2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.