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

السؤال

نشر

لدي بيانات من ملفين وأريد رسم هيستوغرامين لتمثيلهما، لكن أريد أن يكونان على نفس المخطط. في البداية قمت برسم هستوغرام لبيانات من ملف واحد، ونجح الأمر لكن الآن أحاول رسم هستوغرام فوقه (تراكب) من ملف آخر. لكن لم ينجح الأمر هل من مساعدة؟ حيث أن المشكلة هي أنه بالنسبة لكل مجال للقيم، يظهر الشريط ذو القيمة الأعلى فقط، والآخر يكون مخفياً.

Recommended Posts

  • 1
نشر

الحل كالتالي:

from matplotlib.ticker import PercentFormatter
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
# إنشاء بيانات عشوائية 
N_points = 98
n_bins = 15
# إنشاء توزيع يمثل بيانات أول هيستوغرام
x1 = np.random.randn(N_points)
# إنشاء توزيع يمثل بيانات الهستوغرام لثاني
x2 = np.random.randn(N_points)
# تعريف الحاوية
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 ='y',
		linestyle ='-.', linewidth = 0.5,
		alpha = 0.6)
# 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)
# إنشاء الهستوغرامين معاً 
axs.hist([x1,x2], bins = n_bins,label=[x1,x2],color=["red","black"])
# تسمية للمحاور
plt.xlabel("X-axis")
plt.ylabel("y-axis")
legend = ['File1','File2']
plt.legend(legend)
# عنوان
plt.title('Hsoub')
# عرض
plt.show()

الخرج:
index.png.9f6b1a950457dd519b55c6f1e194f3ed.png
حيث قمنا بتمريرهم إلى نفس دالة hist كما فعلت، حيث تقوم الدالة برسم الأعمدة التي تحدد تكرار نفس القيم بجانب بعضها بدل أن تقوم بجعلها فوق بعضها من خلال استخدام دالتين لرسم كل هيستوغرام وبالتالي يصبح المخطط غير مقروء أو صعب القراءة كما في الكود التالي (بنهاية الأمر اختر ماتراه مناسباً لك):

from matplotlib.ticker import PercentFormatter
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import colors
# إنشاء بيانات عشوائية 
N_points = 98
n_bins = 15
# إنشاء توزيع يمثل بيانات أول هيستوغرام
x1 = np.random.randn(N_points)
# إنشاء توزيع يمثل بيانات الهستوغرام لثاني
x2 = np.random.randn(N_points)
# تعريف الحاوية
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 ='y',
		linestyle ='-.', linewidth = 0.5,
		alpha = 0.6)
# 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)
# إنشاء الهستوغرام الأول
axs.hist(x1, bins = n_bins,alpha=0.8)
# إنشاء الهستوغرام الثاني
axs.hist(x2, bins = n_bins,color="red",alpha=0.7)
# تسمية للمحاور
plt.xlabel("X-axis")
plt.ylabel("y-axis")
legend = ['File1','File2']
plt.legend(legend)
# عنوان
plt.title('Hsoub')
# عرض
plt.show()

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

  • 1
نشر (معدل)

الموضوع بسيط حيث يمكنك فقط رسم كل هيستوغرام بمفردة واعطاءهما اسماً ومن ثم وضعهم في نفس الرسمة وسيكونون مختلفين، أنظر المثال التالي للتوضيح:

#استدعاء المكتبات
import random
import numpy
from matplotlib import pyplot

#تخمين أرقام عشوائية
x = [random.gauss(3,1) for _ in range(400)]
y = [random.gauss(4,2) for _ in range(400)]

bins = numpy.linspace(-10, 10, 100)
#رسم الشكلين
pyplot.hist(x, bins, alpha=0.5, label='x')
pyplot.hist(y, bins, alpha=0.5, label='y')
pyplot.legend(loc='upper right')
pyplot.show()

وسيظهروا ببساطة كالتالي:

acUlv.png.2ce96006ef89eb3e5458b090b2ae6369.png

اما اذا لم ترد الرسومات متداخلة وأردتهم بجوار بعضهم البعض يمكنك التعديل قليلا على نفس الكود ليصبح هكذا:

import numpy as np
import matplotlib.pyplot as plt
plt.style.use('seaborn-deep')

x = np.random.normal(1, 2, 5000)
y = np.random.normal(-1, 3, 2000)
bins = np.linspace(-10, 10, 30)

#لاحظ التغيير هنا
plt.hist([x, y], bins, label=['x', 'y'])
plt.legend(loc='upper right')
plt.show()

وستظهر الرسومات بجانب بعضها:

D8Ojb.thumb.png.ef4eafeab481ca476baf5205eaaa13e5.png

تم التعديل في بواسطة Ahmed Sharshar

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...