基本統計圖,方差分析圖,柱狀圖,帶回歸線的散點圖,調節作用的圖


#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()

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM