#object: 畫出像方差分析那樣的圖 #writer: Mike #time: 2020,11,19 import matplotlib.pyplot as plt import numpy as np # 這兩行代碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 輸入統計數據 waters = ('碳酸飲料', '綠茶') buy_number_male = [6, 7] buy_number_female = [9, 4] bar_width = 0.3 # 條形寬度 index_male = np.arange(len(waters)) # 男生條形圖的橫坐標 這里是 0,1,2,3,4, index_female = index_male + bar_width # 女生條形圖的橫坐標 這里是 0.3,1.3,2.3 # 使用兩次 bar 函數畫出兩組條形圖,height表示的是縱坐標,with表示的是長條的寬度,label用於legend的顯示。 plt.bar(index_male, height=buy_number_male, width=bar_width, color='b', label='男性',alpha=0.7) plt.bar(index_female, height=buy_number_female, width=bar_width, color='g', label='女性',alpha=0.7) #畫出一組小長條的標注顯著性的線,這里的坐標使用肉眼看出來的. sigX = [1,1,1.3,1.3] sigY = [8.5,9,9,8.5] plt.plot(sigX,sigY,'b--') #畫出第二個顯著性的線 sigX2 = [0,0,0.3,0.3] sigY2 = [9.5,10,10,9.5] plt.plot(sigX2,sigY2,'b--') #畫出兩組之間的顯著性線 sigX3 = [0.15,0.15,1.15,1.15] sigY3 = [11.3,12,12,11.3] plt.plot(sigX3,sigY3,'b--') #畫出誤差棒,先畫男生的,再畫女生的 plt.errorbar(index_male,buy_number_male,yerr=0.5,fmt='none',ecolor='red',elinewidth=1,capthick=1,capsize=4) plt.errorbar(index_female,buy_number_female,yerr=0.5,fmt='none',ecolor='red',elinewidth=1,capthick=1,capsize=4) #在顯著性的線上畫出兩個小星星,其坐標是通過肉眼看出來的。 plt.text(1.15,9.3,r'**') #畫出第二組的小星星 plt.text(0.15,10.3,r'**') #畫出兩組之間的小星星 plt.text(0.6,12.3,r'**') #規定出縱坐標的范圍,其實還可以用 axis(xmin,xmax,ymin, ymax) plt.ylim(bottom=0,top=13) #注意xticks 的寫法 第一個參數表示的是數字,第二個參數表示的是在數字上顯示的內容 # 讓橫坐標軸刻度顯示 waters 里的飲用水, index_male + bar_width/2 為橫坐標軸刻度的位置 plt.xticks(index_male + bar_width/2, waters) plt.ylabel('購買量') # 縱坐標軸標題 plt.title('購買飲用水情況的調查結果') # 圖形標題 plt.legend() # 顯示圖例 plt.show()
關於帶回歸直線的散點圖
#object: 繪制帶回歸直線的散點圖 #writer: mike #time:2020.11,1 import matplotlib.pyplot as plt import seaborn as sns import pandas as pd # 這兩行代碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = pd.read_csv("C:\\Users\\mike1\\Desktop\\data\\zhanglijia\\dataExperiment3.csv",header=None,sep=',',names=["x","y",'z']) #print(data.iloc[:10,:]) #注意pandas的切片不同於R,不同於numpy data = data.iloc[0:30,:] #data.iloc[30,:]會認為是第30行 #print(data) sns.regplot(x='x',y='y',data=data,color='b') #注意data[1]這指的是行,data.ioc[10]這指的也是行,不同於R plt.title("回歸圖") plt.show() #一下為復制的別人的代碼 # sns.set_style('whitegrid') # plt.figure(figsize=(9,6)) # sns.regplot(x='total_bill', y='tip', data=tips)
關於調節作用的圖
#object: 繪制交互作用的圖 #writer: mike #time:2020,11,19 import pandas as pd import matplotlib.pyplot as plt #import statsmodels.api as sm # 這兩行代碼解決 plt 中文顯示的問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False data = pd.read_csv("C:\\Users\\mike1\\Desktop\\data\\zhanglijia\\dataExperiment3.csv",header=None,sep=',',names=['x','y','z']) data2 = data.iloc[:30,:] #查看pandas的列名 #print(data2.columns.values) # #查看是否有缺失值 # data.isnull().any() #返回矩陣的真值表 # data.isnull().any(axis=1) #查看每行是否有缺失值,返回所有的行 #print(data.isnull().sum()) #計算所有的缺失值的值,這是以列的形式來打印出來 #查看數據的類型 #print(data2.shape) #查看前十行 #print(data2.head(10)) #計算乘積列,注意shape后面沒有小括號,這意味着data2數據集又加入了一列 #新增一列還可以用data.append(data1, ignore_index=True) 這是在添加一個數據框到另一個數據框 data2["xy"] = data2['x'] * data2['y'] #print(data2.shape) #print(data2.head(2)) #對數據框進行描述性統計,還有 .mean() .medean() .mod() .std() .min() .max() .sum() print(data2.describe()) #將自變量因變量取出來作為一個單獨的矩陣 X = data2.iloc[:,[0,1,3]] Y = data2.iloc[:,2] #打印出列名字與行列 print(X.shape) print(X.columns.values) #在回歸方程中,加上截距項,默認是沒有截距項的 X = sm.add_constant(X) #注意這里的X代表着自變量的矩陣 regression = sm.OLS(Y,X) #對模型進行擬合 result = regression.fit() print(result.summary()) #打印出參數的結果,注意params沒有小括號 print(result.params) #接下來通過調節作用的回歸方程來繪制出調節作用的圖像 #這幾個參數是有前面的統計結果得出來的 a0 = 19 a1 = -0.186 a2 = 0.173 a3 = 0.006 #這是調節變量的高一個標准差,以及低一個標准差 modL = 41 modH = 75 #一定要注意這里,這里要對自變量進行排序,否則會出現亂圖,因為原始數據中,自變量是沒有排序的。 #將自變量取出來,並進行排序 #參數的使用方法 # sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, by=None) # axis:0按照行名排序;1按照列名排序 # level:默認None,否則按照給定的level順序排列---貌似並不是,文檔 # ascending:默認True升序排列;False降序排列 # inplace:默認False,否則排序之后的數據直接替換原來的數據框 # kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太關心。 # na_position:缺失值默認排在最后{"first","last"} # by:按照某一列或幾列數據進行排序,但是by參數貌似不建議使用 dataX = data2['x'].sort_values(axis=0) #調節變量高一個標准差的回歸方程為 yL = a0 + a1*modL + dataX * (a2+ a3*modL) yH = a0 + a1*modH + dataX * (a2+ a3*modH) #有了以上的參數就要畫圖了 plt.plot(dataX,yL,color='r',label="低社會比較傾向") plt.plot(dataX,yH,color='g',label="高社會比較傾向") plt.xlabel("學生成績") plt.ylabel("主觀幸福感") plt.legend() plt.show()