-
المساهمات
1068 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
43
إجابات الأسئلة
-
إجابة Ali Haidar Ahmad سؤال في رسم ال Confidence Interval باستخدام Seaborn في بايثون كانت الإجابة المقبولة
نعم ف Seaborn متطورة أكثر مما تتخيل، حيث أنها وبشكل افتراضي تقوم برسم ال Confidence Interval وتمكنك من التحكم بمعامل الثقة من خلال الوسيط ci الذي تكون قيمته الافتراضية مساوية ال 95%.
على سبيل المثال:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt # بفرض البيانات التالية x = np.random.randint(0, 10, 10) y = x+np.random.normal(0, 1, 10) # وسوف نضبط معامل الثقة على 80 regplot سنقوم بتمثيلها من خلال ax = sns.regplot(x, y, ci=80) الخرج:
حيث أن الظل الأزرق يمثل ال confidence level (مستوى الثقة) حول نقطة ما حيث أنه كلما زادات سماكة الظل كلما كان ذلك يعني أن الثقة أكبر.
مثال آخر على ال linplot:
import numpy as np import seaborn as sns import matplotlib.pyplot as plt x = np.random.randint(0, 30, 100) y = x+np.random.normal(0, 1, 100) ax = sns.lineplot(x, y) الخرج:
حيث أننا هنا لم نضبط عامل الثقة فاعتبره تلقائياً 95%.
-
إجابة Ali Haidar Ahmad سؤال في ضبط عدد العلامات ticks و أسماء ال Labels باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك استخدام الددالتين Axes.set_xticks للمحور السيني و Axes.set_yticks للمحور العيني لتعين وضبط ال ticks من خلال قائمة محددة بحجم محدد:
Axes.set_xticks(self, ticks, minor=False) Axes.set_yticks(self, ticks, minor=False) بحيث أن الوسيط ticks هو قائمة تحتوي مواقع ال tick المراد وضعها لكل من المحورين x-axis/y-axis، والوسيط الثاني لتحديد فيما إذا كنت تريد ضبط ال ticks الثانوية أيضاً حيث أنه في الحالة الافتراضية يكون major أي الرئيسية منها.
كما نستخدم الدالة set_xticklabels و set_yticklabels لتعديل تسمياتها حيث نمرر لها قائمة بالتسميات المطلوبة.
لذا يمكنك التعديل على الكود الخاص بك ليصبح:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np sns.set(style="darkgrid") data = pd.DataFrame({'D': np.random.rand(8), 'C': np.random.rand(8)}) ax = sns.lineplot(data=data) # ضبط عدد العلامات للمحور السيني ax.set_xticks(range(8)) # لها labels تحديد ال ax.set_xticklabels(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) الخرج:
أو يمكنك القيام بذلك من خلال الدالة plt.xticks للمحور السيني و plt.yticks للمحور العيني:
import seaborn as sns import matplotlib.pyplot as plt import pandas as pd import numpy as np sns.set(style="darkgrid") data = pd.DataFrame({'D': np.random.rand(8), 'C': np.random.rand(8)}) ax = sns.lineplot(data=data) plt.xticks(range(8), ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']) حيث نمرر لها مُعطيين الأول يمثل عددها والثاني التسميات. ويكون الخرج مطابقاً للخرج أعلاه.
-
إجابة Ali Haidar Ahmad سؤال في كيفية إضافة نص في الوسط ضمن كل subplot باستخدام seaborn في بايثون كانت الإجابة المقبولة
يمكنك القيام بذلك من خلال المرور على كل المحاور axes واستخدام الدالة text:
text(x, y, text, fontsize ) حيث أن كل من x و y يمثلان الموقع المراد إضافة النص فيه. بينما text تمثل النص المطلوب كتابته. وأخيراً fontsize للتحكم بحجم النص المكتوب.
import seaborn as sb sns.set_style("dark") data = sb.load_dataset("exercise") fg = sb.FacetGrid(data, row="diet", col="time", margin_titles = True) fg.map(sb.regplot, "id", "pulse", color = ".4") # لدينا axes نقوم بالمرور على كل for text in fg.axes.flat: # نضيف النص text.text(8, 110,'HsoubAcademy', fontsize = 10) الخرج:
أيضاً يمكنك وضع عنوان لكل محور أو subpllot بالشكل التالي:
import seaborn as sb sns.set_style("dark") data = sb.load_dataset("exercise") fg = sb.FacetGrid(data, row="diet", col="time", margin_titles = True) fg.map(sb.regplot, "id", "pulse", color = ".4") names=['Deltaic', 'Plains','Hummock', 'Swale', 'Sand Dunes', 'Mountain'] for text, title in zip(g.axes.flat, names): text.set_title(title) text.text(8, 110,'HsoubAcademy', fontsize = 10)
-
إجابة Ali Haidar Ahmad سؤال في رسم البيانات الفئوية باستخدام Seaborn في بايثون كانت الإجابة المقبولة
أفضل طريقة هي استخدام catplot وهي مخصصة للتعامل مع البيانات الفئوية، وقد جاءت كتحسين ل FacetGrid، وتقوم الدالة catplot بإرجاع كائن من نوع FacetGrid بحيث يمكن استخدامه بكفاءة لرسم الرسوم البيانية لميزات متعددة ضمن نفس الشكل، ويمكننا من خلالها رسم البيانات في ثمانية أنواع مختلفة من الرسوم البيانية المحددة بواسطة معلمة النوع kind حيث يمكن أن تجعل التمثيل البياني على شكل stripplot أو barplot أو boxplot.
المثال التالي يوضح كيفية استخدامها:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns df = pd.DataFrame( {"Catg": [3,1,2,2,3,3,3,3,1,2,2,1], "Price" : [26,80,54,50,24,25,22,23,80,53,54,77]}) sns.catplot(data = df, x = 'Catg', y = 'Price', kind = 'strip') الخرج:
حيث قمنا برسم فئة المنتجات على المحور السيني والميزة المطلوبة Max_Price على المحور العيني. أيضاً قمنا بتحديد النوع kind على أنه stripplot لذا يمكنك اختيار أي نوع آخر مثل bar في حالة أردت barplot أو box ل boxplot. ومايلي يجمع كل الأنواع:
Categorical scatterplots: stripplot() (with kind="strip"; the default) swarmplot() (with kind="swarm") Categorical distribution plots: boxplot() (with kind="box") violinplot() (with kind="violin") boxenplot() (with kind="boxen") Categorical estimate plots: pointplot() (with kind="point") barplot() (with kind="bar") countplot() (with kind="count")
-
إجابة Ali Haidar Ahmad سؤال في إنشاء Correlation heatmap باستخدام Seaborn في بايثون؟ كانت الإجابة المقبولة
بالتأكيد يمكنك القيام بذلك فالارتباط هو أمر مهم جداً لعلماء البيانات، حيث يخبرنا كيف ترتبط المتغيرات في مجموعة البيانات ببعضها البعض وكيف تتحرك بالنسبة لبعضها البعض.
وتتراوح قيمة الارتباط من -1 إلى +1، مع العلم أن 0 تشير إلى أن المتغيرين مستقلين عن بعضهما البعض. والقيم أكبر من 0 (أي الارتباط الموجب) إلى أن المتغيرات تتحرك في نفس الاتجاه أما السلبي إلى عكس ذلك.
ويمكنك رسم ال Correlation heatmap باستخدام seaborn بسهولة من خلال الدالة heatmap مع الاستعانة بالتابع corr الذي يُطبق على إطار بيانات ويُرجع correlation matrix أي مصفوفة الارتباط بالشكل التالي:
import pandas as pd import matplotlib.pyplot as plt import seaborn as sns data = pd.DataFrame({"Day 1": [7,1,5,6,3,10,5,8], "Day 2" : [1,2,8,4,3,9,5,2], "Day 3" : [4,6,5,8,6,1,2,3], "Day 4" : [5,8,9,5,1,7,8,9]}) # لعرض الارتباطات corr نستخدم الدالة print(data.corr()) """ Day 1 Day 2 Day 3 Day 4 Day 1 1.000000 0.377218 -0.605940 0.194795 Day 2 0.377218 1.000000 -0.373907 0.287647 Day 3 -0.605940 -0.373907 1.000000 -0.416863 Day 4 0.194795 0.287647 -0.416863 1.000000 """ الآن لرسمها:
# plotting correlation heatmap dataplot = sb.heatmap(data.corr(), cmap="YlGnBu", annot=True) الخرج:
-
إجابة Ali Haidar Ahmad سؤال في حفظ المخطط البياني Plot باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك حفظ المخططات البيانية من خلال الدالة savefig:
savefig(fname, dpi=None, format=None,bbox_inches=None) حيث أن الوسيط الأول يمثل المسار الذي تود فيه حفظ الملف الناتج، وال dpi أو dots per inch (وهي وحدة قياس تحدد عدد النقاط الفردية التي يمكن وضعها في مربع 1 × 1 بوصة) وزيادتها تؤدي لزيادة حجم الصورة. أما الوسيط الثالث فهو لتحديد الصيغة التي سيتم فيها حفظ الشكل البياني أي 'png', 'pdf', 'svg' ...إلخ. أما الوسيط الأخير ففي حال ضبطه على tight سيتم إزالة المسافة البيضاء الغير مرغوب فيها التي تكون حول الرسم البياني.
لذا لحفظ مخططك يمكنك أن تكتب:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True df = pd.DataFrame(np.random.random((5, 5)), columns=["a", "b", "c", "d", "e"]) sn = sns.pairplot(df) sn.savefig("plot.png")
-
إجابة Ali Haidar Ahmad سؤال في فرز أعمدة البيانات bar في barplot باستخدام Seaborn في بايثون كانت الإجابة المقبولة
للقيام بالأمر عليك باستخدام الوسيط order ضمن barplot والتابع DataFrame.sort_values حيث يقوم هذا التابع بترتيب إطار بيانات على أساس عمود محدد مثلاً:
df.sort_values('Growth') """ State Growth 3 Gorgenia 266684 2 Albany 308245 0 NewMexico 860280 1 NewYork 994163 """ إذاً لترتيب أعمدة البيانات سنقوم بالتالي:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt State = ["NewMexico", "NewYork", "Albany","Gorgenia"] growth = [860280, 994163, 308245, 266684] df = pd.DataFrame({"State": State, "Growth": growth}) sns.barplot(x='State', y="Growth", data=df,palette="hsv_r", order=df.sort_values('Growth').State) الخرج:
الآن في حال أردت أن يكون الترتيب تنازلي:
import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt State = ["NewMexico", "NewYork", "Albany","Gorgenia"] growth = [860280, 994163, 308245, 266684] df = pd.DataFrame({"State": State, "Growth": growth}) sns.barplot(x='State', y="Growth", data=df,palette="hsv_r", order=df.sort_values('Growth',ascending = False).State) الخرج:
-
إجابة Ali Haidar Ahmad سؤال في كيفية زيادة حجم التعليقات التوضيحية annotations لل Heatmap باستخدام Seaborn في بايثون؟ كانت الإجابة المقبولة
هناك Kwargs (وسيط إضافي) هو annot_kws، ويقبل قاموساً أحد مفاتيحه هو 'size' الذي يتيح لك القدرة على تغيير حجم ال annotations كما يلي:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]) text = np.array([['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'J'], ['K', 'L', 'M', 'N', 'O']]) formatted_text = (np.asarray(["{0}\n{1:.2f}".format( text, data) for text, data in zip(text.flatten(), data.flatten())])).reshape(3, 5) fig, ax = plt.subplots() # annot_kws هنا نمرر الوسيطة الإضافية ax = sns.heatmap(data, annot=formatted_text, fmt="", annot_kws={'size': 15}) الخرج:
-
إجابة Ali Haidar Ahmad سؤال في رسم مخططين بيانيين بشكل متداخل باستخدام seaborn في بايثون كانت الإجابة المقبولة
للقيام بذلك نقوم بإنشاء اثنين subplot على نفس المحور Axes كما يلي:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame({ 'A': [10, 32, 14], 'B': [60, 22, 34], 'C': [21, 10, 5] }) # subplots تعريف ax=plt.subplots() # رسم المخططين على نفس المحور ax=sns.barplot(x=df["A"],y=df["B"],color = 'black') ax=sns.barplot(x=df["A"],y=df["C"],color = 'green') # تحديد أسماء للمحاور ax.set(xlabel="X", ylabel="Y") plt.show() الخرج:
مثال آخر:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt #creating dataframe df=pd.DataFrame({ 'A':[i for i in range(10,110,10)], 'B':[i for i in range(100,0,-10)], 'C':[i for i in range(10,110,10)] }) axes=plt.subplots() axes=sns.barplot(x=df["A"],y=df["B"],color = 'lime') axes=sns.barplot(x=df["A"],y=df["C"],color = 'green') axes.set(xlabel="x-axis", ylabel="y-axis") plt.show()
-
إجابة Ali Haidar Ahmad سؤال في شرح شيفرة بايثون للتحويل بين واحدات التخزين كانت الإجابة المقبولة
كما ذكر وائل هذا البرنامج خاص بالتحويلات.
سأشرح لك آخر جزئية طلبتها (لماذا الدوال ولماذا أضفناها).
بدايةً بشكل عام عند البرمجة يُفضل دوماً أن نتجه لاستخدام الدوال حتى ولو كان بالإمكان الاستغناء عنها.
الآن انسى الكود الذي لديك وتخيل أنه قد طلب منك كتابة البرنامج التالي:
برنامج يقوم بتحويل قيمة من الميغابايت إلى إحدى الوحدات التالية:
البايت عند إدخال الرقم 1.
الكيلو عند إدخال الرقم 2.
الغيغا عند إدخال الرقم 3.
التيرا عند إدخال الرقم 4.
الآن يمكننا كتابة هذا البرنامج بالكامل من دون استخدام التوابع لكن سيكون الأمر مُتخلفاً جداً. لذا سنقوم بتقسيمه إلى دوال، بحيث كل دالة تنجز أمر معين، وهذا التقسيم كالتالي:
دالة تقوم بالتحويل من الميغابايت إلى البايت سنسميها showBytesFirstName.
دالة تقوم بالتحويل من الميغابايت إلى الكيلوبايت سنسميها showKiloBytesFirstName.
دالة تقوم بالتحويل من الميغابايت إلى الغيغا سنسميها showGigaBytesFirstName.
دالة تقوم بالتحويل من الميغابايت إلى التيرا سنسميها showTeraBytesFirstName.
وأخيراً نقوم ببناء دالة تعرض الرسالة التالية على المستخدم:
1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program فإذا اختار 1 تقوم هذه الدالة باستدعاء الدالة showBytesFirstName. وإذا اختار 2 تقوم هذه الدالة باستدعاء الدالة showKiloBytesFirstName... إلخ.
وأخيراً تعرض النتيجة ..
وأيضاً يجب أن تعرض هذه الدالة الرسالة التالية، والتي تطلب فيها من المستخدم إدخال القيمة المُراد تحويلها (من الميغابايت إلى الوحدة التي تم اختيارها):
Enter Data in MegaBytes (MB) وهذا مايُعبر عنه بالكود الذي أرفقته:
# دالة للتحويل من الميغابايت إلى البايت def showBytesFirstName(megabytes): # converting into bytes byte=megabytes*1024*1024 # 1MB=1024*1024 bytes print("\n") print(megabytes,"Megabytes is",byte,"Bytes.") # دالة للتحويل من الميغابايت إلى الكيلوبايت def showKiloBytesFirstName(megabytes): # converting into Kilo bytes kbyte=megabytes*1024 #1MB=1024 KiloBytes print("\n") print(megabytes,"Megabytes is",kbyte,"KiloBytes.") # دالة للتحويل من الميغا إلى الغيغا def showGigaBytesFirstName(megabytes): #Converting into GigaBytes gbyte=megabytes/1024 #1024 MB= 1Giga Bytes print("\n") print(megabytes,"Megabytes is",round(gbyte,6),"GigaBytes.") #round function rounds a float upto 6 digit # دالة للتحويل من الميغا إلى التيرا def showTeraBytesFirstName(megabytes): #converting into TeraBytes tbyte=megabytes/(1024*1024) #1024*1024 MB= 1 Tera Bytes print("\n") print(megabytes,"Megabytes is",round(tbyte,6),"TeraBytes.")#rounding a float upto 6 digit # دالة تجمع الدوال السابقة لبناء برنامج تحويل من الميغا إلى باقي الوحدات def menuFirstName(): # حلقة لانهائية أي سيتم تكرار الكود المُعرّف ضمنها # True طبعاً هي حلقة لانهائية لأن الشرط دوماً محقق حيث أن 1 يكافئ while(1): # loop countinue until 5 is pressed # هنا يطلب إدخال عدد من المستخدم num = int(input(""" 1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program Please enter your choice: """)) # في حال أدخل الرقم 5 تتوقف الحلقة اللانهائة وينتهي التنفيذ أي يتوقف البرنامج if(num==5): # if 5 is pressed loop will break program terminated print("Bye!") # تؤدي إلى كسر الحلقةأي جعلها تتوقف عن التكرار وبالتالي يتوقف التنفيذ break هنا تعليمة break # الآن إذا لم يدخل المستخدم الرقم 5 يطلب منه إدخال القيمة المراد تحويلها elif(num<5): #if num is less than 5 we will ask user to enter Mega bytes megabytes=int(input("Enter Data in MegaBytes (MB)")) # الآن إذا كان المستخدم قد أدخل الرقم 1 فهذا يعني أنه يريد تحويل القيمة # إلى البايت if(num==1): # if num==1 calling bytes method # وبالتالي نستدعي الدالة التي تقوم بالتحويل إلى البايت ونمرر لها القيمة showBytesFirstName(megabytes) # وهكذا...... elif(num==2): #if num=2 calling kilobytes showKiloBytesFirstName(megabytes) elif(num==3): #if num=3 calling giga bytes showGigaBytesFirstName(megabytes) elif(num==4):#if num==4 calling tera bytes showTeraBytesFirstName(megabytes) else: #else loop will countinue print("\n") print("Please Enter Valid Choice") # هنا يتم استدعاء الدالة السابقة menuFirstName() طبعاً الكود يستخدم حلقة while بحيث يتم تكرار تنفيذ التعليمات حتى تخرج من البرنامج من خلال إدخال الرقم 5.
على سبيل المثال سأقوم بتشغيل البرنامج السابق وتجربته:
1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program Please enter your choice: 2 Enter Data in MegaBytes (MB)1 1 Megabytes is 1024 KiloBytes. 1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program Please enter your choice: 1 Enter Data in MegaBytes (MB)1 1 Megabytes is 1048576 Bytes. 1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program Please enter your choice: 3 Enter Data in MegaBytes (MB)5 5 Megabytes is 0.004883 GigaBytes. 1: Convert to bytes 2: Convert to KiloBytes(KB) 3: Convert to GigaBytes(GB) 4: Convert to TeraBytes(TB) 5: Quit the program Please enter your choice: 5 Bye!
-
إجابة Ali Haidar Ahmad سؤال في إضافة نصوص توضيحية ضمن خلايا ال Heatmap باستخدام Seaborn في بايثون كانت الإجابة المقبولة
لإضافة نصوص توضيحية نستخدم الوسيط annot ونمرر له قائمة تحتوي العبارات التوضيحية للخلايا بالترتيب كما يلي:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]) text = np.array([['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'J'], ['K', 'L', 'M', 'N', 'O']]) fig, ax = plt.subplots() ax = sns.heatmap(data, annot=text, fmt="") الخرج:
الآن للدمج بين data و ال text يمكنك استخدام الطريقة التالية:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]]) text = np.array([['A', 'B', 'C', 'D', 'E'], ['F', 'G', 'H', 'I', 'J'], ['K', 'L', 'M', 'N', 'O']]) # نقوم بدمجهم يدوياً formatted_text = (np.asarray(["{0}\n{1:.2f}".format( text, data) for text, data in zip(text.flatten(), data.flatten())])).reshape(3, 5) fig, ax = plt.subplots() ax = sns.heatmap(data, annot=formatted_text, fmt="") الخرج:
-
إجابة Ali Haidar Ahmad سؤال في إضافة إطار إلى المخطط البياني Plot باستخدام Seaborn في بايثون كانت الإجابة المقبولة
للقيام بالأمر يمكنك أن تستخدام كُلاً من الدالة axvline التي تقوم برسم خط عمودي والدالة axhline التي تقوم برسم خط أفقي.حيث نقوم برسم خطين أفقين وخطين عموديين وبالتالي نشكل إطار.
سنرسم الخط الأفقي الأول عند النقطة y=0، والخط الأفقي الثاني عند y=عدد الصفوف في مجموعة البيانات الخاصة بك.
سنرسم الخط العمودي عند x=0 و الثاني عند x=عدد الأعمدة في مجموعة البيانات.
import seaborn as sns import matplotlib.pyplot as plt example = sns.load_dataset("flights") example = example.pivot("month", "year", "passengers") res = sns.heatmap(example) # الخطين الافقيين res.axhline(y = 0, color='c',linewidth = 10) res.axhline(y = example.shape[1], color = 'c', linewidth = 10) # العموديين res.axvline(x = 0, color = 'c', linewidth = 10) res.axvline(x = example.shape[0], color = 'c', linewidth = 10) plt.show() هنا أضفنا إطار لونه أزرق فاتح (سمائي).
-
إجابة Ali Haidar Ahmad سؤال في استخدام نماذج الألوان Color Palette ضمن ال Boxplot باستخدام Seaborn في بايثون كانت الإجابة المقبولة
نعم تحتوي seaborn على العديد من لوحات التلوين:
CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cividis, cividis_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, ويمكنك استخدام أيّاً منها من خلال الوسيط palette كما يلي:
data_df = df.melt(var_name='Pulses', value_name='Tons Consumed') sns.boxplot(x="Pulses", y="Tons Consumed", data=data_df, palette="Set1") كما يمكنك إنشاء لوحة ألوان خاصة بك لتلوين ال boxplot كما يلي:
# تعريف قائمة تحتوي الألوان بالترتيب my_colors = [ "#3498db","#9b59b6","#2ecc71", "#006a4e"] # ونمرر لها قائمة الألوان set_palette نستخدم الدالة sns.set_palette( my_colors ) # boxplot الآن نستدعي ال sns.boxplot( x = "Pulses", y = "Tons Consumed", data = data_df)
-
إجابة Ali Haidar Ahmad سؤال في كيفية تغيير حجم شريط الألوان colorbar للخريطة الحرارة heatmap باستخدام seaborn في بايثون؟ كانت الإجابة المقبولة
يمكنك استخدام الوسيط cbar_kws للقيام بذلك حيث نمرر له قاموساً يحتوي المفتاح shrink ومن خلال قيمة هذا المفتاح يمكننا التحكم بحجمه، فبشكل افتراضي يكون 1، وبالتالي أي قيمة أقل من 1 تؤدي لتصغيره وأي قيمة أكبر من واحد تؤدي لتكبيره.
import numpy as np; np.random.seed(0) import seaborn as sns; sns.set_theme() uniform_data = np.random.rand(10, 12) ax = sns.heatmap(uniform_data, cbar_kws={'shrink': 0.5}) الخرج:
-
إجابة Ali Haidar Ahmad سؤال في تغيير لون الخلفية Background باستخدام seaborn في بايثون كانت الإجابة المقبولة
يمكنك تغييرها من خلال استخدام الوسيط rc ضمن الدالة set حيث نمرر له قاموساً مفاتيحه هي axes.facecolor وقيمته تمثل لون ال axes (أي لون المكان الذي يتم فيه رسم الشكل البياني) و figure.facecolor وقيمته تمثل لون ال figure (الحاوية الكلية).
import seaborn as sns import matplotlib.pyplot as plt # loading dataset data = sns.load_dataset("iris") # draw lineplot sns.lineplot(x="sepal_length", y="sepal_width", data=data) # هنا سنجعل اللون أحمر للمحور وأزرق للحاوية sns.set(rc={'axes.facecolor':'red', 'figure.facecolor':'blue'}) plt.show() الخرج:
حل آخر من خلال الدالة set_style التي تأخذ القيم التالية ticks - white - dark - darkgrid - whitegrid:
import seaborn as sns import matplotlib.pyplot as plt # loading dataset data = sns.load_dataset("iris") # draw lineplot sns.lineplot(x="sepal_length", y="sepal_width", data=data) sns.set_style("dark") plt.show() الخرج:
-
إجابة Ali Haidar Ahmad سؤال في ضبط حدود قيم المحاور باستخدام seaborn في بايثون كانت الإجابة المقبولة
يمكنك القيام بذلك من خلال الدالة plt.ylim للمحور العمودي و plt.xlim للمحور الأفقي، حيث نمرر له القيمة الصغرى والعليا.
from matplotlib import pyplot as plt import seaborn as sns plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True sns.set_style("whitegrid") tips = sns.load_dataset("tips") ax = sns.boxplot(x="day", y="total_bill", data=tips) plt.ylim(5, 50) plt.show() الخرج:
أو من خلال ax.set_ylim و ax.set_xlim:
from matplotlib import pyplot as plt import seaborn as sns plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True sns.set_style("whitegrid") tips = sns.load_dataset("tips") ax = sns.boxplot(x="day", y="total_bill", data=tips) ax.set_ylim(5, 50) plt.show() والنتيجة نفسها..
أو من خلال ax.set(ylim=(5, 50)).
-
إجابة Ali Haidar Ahmad سؤال في كيفية إضافة ملصق label إلى شريط ألوان Heatmap باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك القيام بذلك من خلال الوسيط cbar_kws كما يلي:
import pandas as pd import seaborn as sns df = pd.DataFrame({'A':(10,20,30,40), 'B':(10,20,30,40), 'C':(90,110,130,200)}) sns.heatmap(df.pivot_table(index='B', columns='A', values='C'), cbar_kws={'label': 'Hello Hasoub'}) الخرج:
-
إجابة Ali Haidar Ahmad سؤال في منع seaborn من حفظ المخططات فوق بعضها كانت الإجابة المقبولة
يجب عليك أن تقوم بإنشاء شكل figure جديد من أجل حل المشكلة، ويمكنك القيام بذلك بإحدى الطرق التالية:
1. إنشاء شكل جديد قبل كل مخطط من خلال استدعاء الدالة plt.figure:
import seaborn as sns data = sns.load_dataset('iris') plt.figure() plot1 = sns.barplot(x='sepal_length', y='species', data=data).get_figure() plot1.savefig('plot1.pdf') plt.figure() plot2 = sns.barplot(x='sepal_width', y='species', data=data).get_figure() plot2.savefig('plot2.pdf') 2. عن طريق إلغاء استدعاء الدالة get_figure ثم استدعاء plt.savefig كما يلي:
import seaborn as sns import matplotlib.pyplot as plt data = sns.load_dataset('iris') plot1 = sns.barplot(x='sepal_length', y='species', data=data) plt.savefig('plot1.pdf') plt.clf() plot2 = sns.barplot(x='sepal_width', y='species', data=data) plt.savefig('plot2.pdf')
-
إجابة Ali Haidar Ahmad سؤال في كيفية الكتابة والقراءة في لغة السي كانت الإجابة المقبولة
لفتح ملف يمكنك استخدام الدالة fopen التي لها الشكل التالي:
FILE *fopen(const char *filename, const char *mode) تُرجع هذه الدالة مؤشراً على الملف.
حيث أن:
filename: هي اسم الملف المطلوب.
mode يمثل الحالة التي تريد فتح الملف فيها، ويمكننا أن نختار:
1. "r" للقراءة فقط.
2. "w" للكتابة فقط (تؤدي إلى إنشاء الملف إذا لم يكن موجوداً).
3. "a" لإلحاق الملف ببيانات جديدة في نهايته (أي تبدأ الكتابة من نهاية الملف الموجود).
4. "+r" للقراءة والكتابة في الملف.
5. "+w" للقراءة والكتابة (تؤدي إلى إنشاء الملف إذا لم يكن موجوداً).
6. "+a" للقراءة ,والتحديث (تؤدي إلى إنشاء الملف إذا لم يكن موجوداً). ستبدأ القراءة من البداية، لكن
الكتابة يمكن إلحاقها فقط.
بعد ذلك يمكنك معالجة الملف بالشكل الذي تحتاجه و باستخدام الدوال المناسبة. وهنا غالباً مانحتاج لدوال مثل دالة القراءة ()fread، ودالة الكتابة ()fwrite، ودالة التنقل ()fseek التي تمكننا من التنقل داخل الملف أثناء القراءة أو الكتابة فيه، والدالة ()ftill التي تدلنا على مكان وجودنا داخل الملف.
مثال:
// وذلك لأن الملف غير موجود طبعاً file.txt نتيجة الكود التالي هي إنشاء ملف باسم // We are in 2021 سنضع في الملف الجملة #include <stdio.h> #include <stdlib.h> int main () { // مؤشر من نوع ملف FILE * fp; // فتح الملف fp = fopen ("file.txt", "w+"); // محتوى الملف fprintf(fp, "%s %s %s %d", "We", "are", "in", 2021); // إغلاق الملف fclose(fp); return(0); } للكتابة ضمن الملف يمكن أن تستخدم الدالة fwrite:
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) يستخدم هذا التابع للكتابة بداخل الملف. ويُرجع عدد صحيح يمثل عدد الكلمات التي كُتبت ضمن الملف.
ptr: مؤشر لمصفوفة العناصر المراد كتابتها.
size: الحجم بالبايت لكل عنصر تتم كتابته.
nmemb: عدد العناصر، كل عنصر بحجم البايت.
stream: مؤشر إلى كائن FILE.
مثال:
#include<stdio.h> #include<stdib.h> #include<string.h> int main () { FILE *f=fopen("textfile.txt","w"); // فتح الملف char *s = "blabla"; // تعريف النص المطلوب كتابته fwrite(s, sizeof(char), strlen(s), f); fclose(f); return 0; } الوسيط الثاني الذي مررناه إلى الدالة هو sizeof(char) لأن بياناتنا هي عبارة عن مصفوفة محارف وبالتال كل عنصر هو عبارة عن محرف char حجمه 1 بايت وبالتالي سيكون ال size=1 وبما أن أحجام أنواع البيانات قد تختلف من معمارية جهاز إلى آخر فسنضع sizeof(char). أما الوسيط الثالث هو عدد العناصر التي ستتم كتابتها ضمن الملف وهذا يكافئ عدد عناصر مصفوفة المحارف لذا استخدمنا strlen.
للقراءة من الملف نستخدم الدالة fread:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) لاحظ أن وسطاء هذه الدالة لاتختلف عن وسطاء دالة الكتابة مع ملاحظة أن الوسيط ptr هنا سنستخدمه لتخزين النص الذي سنقوم بقراءته.
الآن بعد أن قمنا بالكتابة ضمن الملف في الخطوة السابقة، سنقوم بكتابة كود آخر لقراءة محتويات الملف، لذا سنقوم أولاً بفتح الملف لكن مع تحديد وضع القراءة هذه المرة "r":
FILE *f = fopen("textfile.txt", "r"); ثم سنقوم باستخدام الدالة fread لقراءة المحتويات.
لكن الأمر ليس بهذه البساطة فهنا سنحتاج لتحديد عدد عناصر الملف الذي ستتم قرائته (أقصد ال nmemb)، وذلك لأننا نريد حجز ذاكرة تتسع لما ستتم قرائته، ولمعرفة ذلك سنقوم باستخدام الدالتين ()ftell و ()fseek، حيث سنقوم باستخدام الدالة ()fseek للانتقال من خلالها إلى نهاية الملف:
int fseek(FILE *stream, long int offset, int whence) الوسيط الأول هو مؤشر للملف المطلوب. أما الثاني فهو قيمة إزاحة موقع المؤشِّر بالبايت (سنضعها على صفر -سنعرف السبب بعد قليل-).
أما الوسيط الأخير فيأخذ إحدى القيم التالية:
0 أو Seek_SET:
تغيير موقع المؤشِّر إلى قيمة المعامل offset المعطاة بالبايت. أي تنقلنا تماماً إلى قيمة المعامل الثاني، فلو كان 1 ستنقلنا للمحرف الأول ولو كان 0 -كما في حالتنا- ستنقلنا لبداية الملف، لذا فإن هذه الحالة لاتخدمنا لأن غايتنا الانتقال لنهاية الملف.
1 أو Seek_CUR:
تغيير موقع المؤشر إلى قيمة المعامل offset المعطاة بالبايت مضافًا إليها قيمة موقع المؤشِّر الحالي. أي بعبارةٍ أوضح تنقلنا من مكاننا الحالي إلى الأمام بمقدار ال offset التي تم تحديدها، وبالتالي إذا وضعنا مكان ال offset ستنقلنا للمحرف الأول، ولو وضعنا 0 فلن يكون لها أي تأثير. وهذه الحالة أيضاً لاتخدمنا.
2 أو Seek_END:
تغيير موقع المؤشِّر إلى قيمة موقع نهاية الملف مضافًا إليها قيمة المعامل offset المعطاة بالبايت. أي تنقلنا لنهاية الملف، وهذا مانحتاج إليه. لذا سنستدعي هذه الدالة في مثالنا بالشكل التالي:
fseek(f, 0, SEEK_END); الآن بعد أن انتقلنا إلى نهاية الملف أصبح بإمكاننا معرفة حجم الملف من خلال الدالة tell التي ستخبرنا بالموقع الذي نحن فيه، وهذا يكافئ عدد البايتات من بداية الملف، وبالتالي نكون حصلنا على المطلوب.
unsigned int sz = ftell(f); الآن بعد معرفة حجم الملف أصبح بإمكاننا حجز ذاكرة تتسع لما ستتم قرائته، لذلك سنستخدم الدالة malloc، وكذلك سنقوم مرة أخرى باستخدام الدالة fseek للعودة إلى بداية الملف:
fseek(f, 0, SEEK_SET); char *data = (char *)malloc(sz); ثم نقوم باستدعاء دالة القراءة بالشكل التالي:
fread(data, sizeof(char), sz, f); وأخيراً طباعة النص:
printf("File has been printed \n%s", data); free(data); fclose(f); الكود كاملاً:
#include <stdlib.h> #include <string.h> #include <stdio.h> int main() { FILE *f = fopen("textfile.txt", "r"); fseek(f, 0, SEEK_END); unsigned int sz = ftell(f); fseek(f, 0, SEEK_SET); char *data = (char *)malloc(sz); fread(data, sizeof(char), sz, f); printf("File has been printed \n%s", data); free(data); fclose(f); return 0; }
-
إجابة Ali Haidar Ahmad سؤال في رسم مخططات boxplot ضمن subplots باستخدام seaborn في بايثون كانت الإجابة المقبولة
يمكنك القيام بذلك بالشكل النالي:
import seaborn as sns import pandas as pd %pylab inline df = pd.DataFrame({'Alpha' :['one','one','two','two','one','two','one','one','one','two'], 'Beta': [1,2,1,2,1,2,1,2,1,1], 'Gama': [1,2,3,4,6,1,2,3,4,6]}) # بالعدد الذي نريده subplots نقوم بتعريف شكل مع f, axes = plt.subplots(1, 2) # axes[1] والثاني axes[0] هنا قمنا بتعريف اثنين الأول هو # subplot حيث أن المحاور عبارة عن مصفوفة مع كل # نريده subplot الآن نضع كل مخطط ضمن # ax وذلك من خلال الوسيط sns.boxplot( y="Beta", x= "Alpha", data=df, orient='v' , ax=axes[0]) # المخطط الأول sns.boxplot( y="Gama", x= "Alpha", data=df, orient='v' , ax=axes[1]) # المخطط الثاني # وهكذا.. الخرج:
-
إجابة Ali Haidar Ahmad سؤال في تغيير حجم الخط باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك التحكم بحجم الخط من خلال sns.set والوسيط fontsize كما في المثال التالي:
import pandas as pd import matplotlib.pyplot as plt df = pd.DataFrame({"Day 1": [7,1,5,6,3,10,5,8], "Day 2" : [1,2,8,4,3,9,5,2]}) import seaborn as sns sns.set() # نستخدمها قبل الرسم لضبط كل شيء على الحالة الافتراضية p = sns.lineplot(data = df) p.set_xlabel("X-Axis", fontsize = 20) # تحديد حجم تسمية المحور الأفقي p.set_ylabel("Y-Axis", fontsize = 20) # تحديد حجم تسمية المحور العمودي p.set_title("Plot", fontsize = 20) # تحديد حجم العنوان plt.legend(labels=["Legend_Day1","Legend_Day2"], fontsize = 20) # legend تحديد حجم ال الخرج:
-
إجابة Ali Haidar Ahmad سؤال في تغيير موقع ال Legend ضمن المخطط البياني باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك تغيير موقعه من خلال ضبط الوسيط legend في الدالة factorplot على false (لكي لايقوم بعملية إضافة تلقائية له). ثم استخدام الدالة plt.legend لإضافته في الموقع المطلوب:
import seaborn as sns import matplotlib.pyplot as plt sns.set(style="whitegrid") titanic = sns.load_dataset("titanic") g = sns.factorplot("class", "survived", "sex", data=titanic, kind="bar", size=6, palette="muted", legend=False) g.despine(left=True) plt.legend(loc='upper left') # في الزاوية العليا اليسارية g.set_ylabels("survival probability") ويمكن تمرير القيم التالية أيضاً:
'upper left', 'upper right', 'lower left', 'lower right' 'upper center', 'lower center', 'center left', 'center right' الخرج:
-
إجابة Ali Haidar Ahmad سؤال في كيف نضع عنوان عام لعدة مخططات بيانية باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك وضع عنوان عام من خلال fig.suptitle كما يلي:
# plt.xticks(rotation=45) # ax.tick_params(axis='x', rotation=90) import seaborn as sns tips = sns.load_dataset('tips') rp = sns.relplot(data=tips, x='total_bill', y='tip', col='sex', row='smoker', kind='scatter') rp.fig.subplots_adjust(top=0.9) rp.fig.suptitle('ONE TITLE FOR ALL') والخرج:
وكحل آخر يمكنك استخدام plt.suptitle كما يلي:
import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset('tips') rp = sns.relplot(data=tips, x='total_bill', y='tip', col='sex', row='smoker', kind='scatter') rp.fig.subplots_adjust(top=0.9) plt.suptitle("Title")
-
إجابة Ali Haidar Ahmad سؤال في تدوير Rotate تسميات المحاور labels باستخدام Seaborn في بايثون كانت الإجابة المقبولة
يمكنك القيام بذلك بعدة طرق.. تابع المثال التالي:
import seaborn as sns import matplotlib.pyplot as plt sns.set(style="whitegrid") iris = sns.load_dataset('iris') ax = sns.stripplot(x='species', y='sepal_length', data=iris) plt.title('Graph') plt.show() الخرج:
الآن لتدوير ال Labels يمكنك استخدام الدالة التالية:
ax.tick_params(axis='x', rotation=90) بحيث الوسيط الأول هو اسم المحور المطلوب تطبيق التدوير على ملصقاته، والوسيط الثاني هو درجة التدوير.
أو من خلال كائن plt باستخدام الدالة:
plt.xticks(rotation=90) # للمحور الأفقي plt.yticks(rotation=90) # للمحور العمودي وبالتالي:
import seaborn as sns import matplotlib.pyplot as plt sns.set(style="whitegrid") iris = sns.load_dataset('iris') ax = sns.stripplot(x='species', y='sepal_length', data=iris) ############# ax.tick_params(axis='x', rotation=90) ############# plt.title('Graph') plt.show() الخرج:
-
إجابة Ali Haidar Ahmad سؤال في إعطاء أسماء labels للمحاور باستخدام Seaborn في بايثون كانت الإجابة المقبولة
الدالة barplot تُرجع axis-object وليس figure-object لذا لايمكنك استخدام الدالة set_axis_labels مع كائن محور، هنا يجب أن تستخدم الدالة ax.set كما يلي:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt df = pd.DataFrame({'color': ['black', 'blue', 'brown'], 'num': [1, 2, 3]}) ax = sns.barplot(x = 'num', y = 'color', data = df, color = 'red') ax.set(xlabel='xlabel', ylabel='ylabel') plt.show() الخرج: