用python做完這四幅圖之後我覺得還是該學學Origin吧 ——J.C.Bourbon
一直在尋求用python完全代替Origin,這不,這會的大物實驗——光的偏振,要做極坐標,馬上就來勁了。
最初的版本是很直接plt.polar(theta,r),但這樣做出來的圖有一點致命的問題——所有設置都是默認的,沒法去調整,如果用此前作圖時用的精細化調整方法plt.xlim(), plt.xticks()會報錯。
這裡面有一個很大的問題——如果不作調整的話極坐標圖角度默認以45°為間隔。而這個實驗的結果是每10°讀一個數得到的,45°截距完全不能體現科學作圖的宗旨
這就是那個自己感覺都不太行的45度截距圖
以及它對應的代碼片段
# 普通極坐標圖plt.figure(5)plt.rcParams['font.family'] = fontplt.rcParams['font.size'] = fs-2# 調整matplotlib內部設置使之支持中文,這種方法改變全局設置plt.polar(x_r, y21, 'o-', color='red', label='偏離光軸0度', ms=ms, lw=lw)plt.polar(x_r, y22, 'o-', color='purple',label='偏離光軸30度', ms=ms, lw=lw)plt.xlabel('θ /°', fontsize=fs)# ax2.set_ylabel('光強I', fontsize=fs,)plt.title('通過1/2波片的偏振光光強-角度曲線', fontsize=fs+4)plt.legend(loc='best')經不懈搜索學習,明確了一點:Matplotlib.pyplot一旦要把圖做的很細緻,就一定是要回到python的最初的屬性——面向對象的編程思想。要把圖層,圖軸等全部作為對象處理才能得到很好的結果
最終,我大概是得到了我需要的圖...光的偏振實驗需要三張圖,我自己因為用py線性擬合地很得心應手了,也就順便做了一下。(雖然statsmodels包在我anaconda更新之後突然就沒了,搞得還要重裝...但anaconda裝包還是很方便的)
放最終結果圖:一個曲線,一個對應線性擬合,兩個極坐標(P.S.圖帶水印,直接搬運去做實驗報告可不好哦,需要可以聯繫我)
分享原始碼
# 大物實驗數據處理 光的偏振# JamesBourbon in 20200524# 極坐標作圖的極好例子
import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport statsmodels.api as sm
def linear(x, y): # 線性回歸擬合,一個非常高端的擬合算法 x_n = sm.add_constant(x) # statsmodels進行回歸時,一定要添加此常數項 model = sm.OLS(y, x_n) # model是回歸分析模型 results = model.fit() # results是回歸分析後的結果 # 輸出回歸分析的結果並進行線性回歸出圖 print(results.summary()) print('Parameters: ', results.params) print('R2: ', results.rsquared) # 擬合係數的排列方法和多項式係數排列方法相反 # 需要在這裡做一個多項式係數的reverse result_poly = [] result_poly.append(results.params[1]) result_poly.append(results.params[0]) return np.array(result_poly), results.rsquared # 返回線性擬合參數和R^2值
input_file = "光的偏振.csv"
lw = 3.5ms = 12.5fs = 22font = 'KaiTi'# font = 'Arial Unicode MS# 配色:紅紫配色 探索出來的很好的雙色配色法# 極坐標圖的顯示是角度制,輸入是弧度制
data = pd.read_csv(input_file)x = np.array(data['\\theta'])x_r = np.array(data['\\theta'] * np.pi/180)y0 = np.array(data['I_0'])y1 = np.array(data['I_1/4_30'])y21 = np.array(data['I_1/2_0'])y22 = np.array(data['I_1/2_30'])cosx2 = np.cos(x_r) ** 2
# 線性擬合P_linear, R2 = linear(cosx2, y0)xx = np.arange(0, 1, 0.01)yy = np.polyval(P_linear, xx)
# 馬呂斯定律plt.figure(1)
plt.rcParams['font.family'] = fontplt.rcParams['font.size'] = fs-2# 調整matplotlib內部設置使之支持中文,這種方法改變全局設置# 坐標軸刻度my_x_ticks = np.arange(0, 390, 30)plt.xticks(my_x_ticks)# 作圖plt.plot(x, y0, '-.',color='purple', linewidth=lw)plt.plot(x, y0, 'ro', label='實驗數據點', markersize=ms,)plt.xlabel('θ /°', fontsize=fs)plt.ylabel('光強I', fontsize=fs)plt.title('驗證馬呂斯定律曲線', fontsize=fs+4)plt.grid()plt.legend()
# 馬呂斯定律線性擬合plt.figure(2)plt.rcParams['font.family'] = fontplt.rcParams['font.size'] = fs-2# 調整matplotlib內部設置使之支持中文,這種方法改變全局設置plt.plot(xx, yy, '-.', color='purple', label='擬合曲線', linewidth=lw)plt.plot(cosx2, y0, 'ro', label='實驗數據點', markersize=ms ,linewidth=lw)plt.xlabel(r'$cos^2(θ)$', fontsize=fs)plt.ylabel('光強I', fontsize=fs)plt.title('驗證馬呂斯定律線性擬合線', fontsize=fs+4)# 擬合線描述圖例txt_point = (0.6, 15)# 找到的一個最好點,亦可對此處代碼進行改進msg = '擬合方程: y = {:.4g} x + {:.4g}\n R2 = {:.4f}'.format( P_linear[0], P_linear[1], R2)plt.annotate(msg, xy=txt_point, xytext=txt_point)plt.grid()plt.legend()
# 1/4波片的I的極坐標圖# Matplotlib最強大的調整是面向對象的方法fig3 = plt.figure(3)plt.rcParams['font.family'] = fontplt.rcParams['font.size'] = fs-2# 調整軸對象的屬性ax1 = fig3.add_axes([0.1,0.1,0.8,0.8],polar=True)# 添加極坐標軸的默認方法# ax1.set_thetamin, thetamax, rmin rmax, yticks# 不能用坐標圖常用的plt.xticks方式ax1.set_xticks(np.arange(0, 2*np.pi, np.pi/6))# 調整matplotlib內部設置使之支持中文,這種方法改變全局設置ax1.plot(x_r, y1, '-',color='purple', lw=lw)ax1.plot(x_r, y1, 'o', color='red', label='偏離光軸30度', ms=ms)ax1.set_xlabel('θ /°', fontsize=fs)# ax1.set_ylabel('光強I', fontsize=fs,)ax1.set_title('通過1/4波片的偏振光光強-角度曲線', fontsize=fs+4)fig3.legend(loc='best')
# 1/2波片的I的極坐標圖# 紅紫配色方案和紅棕配色方案都是科研作圖的不錯選擇fig4 = plt.figure(4)plt.rcParams['font.family'] = fontplt.rcParams['font.size'] = fs-2# 調整matplotlib內部設置使之支持中文,這種方法改變全局設置ax2 = fig4.add_axes([0.1,0.1,0.8,0.8],polar=True)ax2.set_xticks(np.arange(0, 2*np.pi, np.pi/6))
ax2.plot(x_r, y21, 'o-', color='red', label='偏離光軸0度', ms=ms, lw=lw)ax2.plot(x_r, y22, 'o-', color='purple',label='偏離光軸30度', ms=ms, lw=lw)ax2.set_xlabel('θ /°', fontsize=fs)# ax2.set_ylabel('光強I', fontsize=fs,)ax2.set_title('通過1/2波片的偏振光光強-角度曲線', fontsize=fs+4)fig4.legend(loc='best')
plt.show()以及,用pandas的pd.read_csv導入數據的數據表大概的樣子:
\theta,I_1/4_30,I_1/2_30,I_1/2_0,I_00,31.24,12.5,49.98,49.9810,34.57,20.65,48.48,48.4820,36.74,29.33,44.14,44.1430,37.49,37.49,37.49,37.4940,36.74,44.14,29.33,29.33.於是乎,只要改動這個csv裡面的輸入數據,就可以實現不同實驗結果的快速做圖分析,於是乎,這個python腳本可以被拿來無限次地對這個實驗進行分析了
啊等我有時間去維護一下那個experiment_kit...它的一些思想可以參見我前期的一些推送(關注我,在主頁點擊「技術推送」可以看到),如果有朋友願意把那個項目發展成自帶前端代碼內嵌的優秀應用的話歡迎與我聯繫,我自己是沒精力做那個了....
你以為這就完了?
這次的主題還真的不是python,而是...
這萬惡的Origin怎麼這麼香啊
此前一直在尋求用python來完全替代Origin,不管是普通的plot,還是線性擬合,甚至是作DOS圖並計算d帶中心,都是自己打開VScode寫代碼完成的,
理由很簡單
Origin就是感覺解析度不如matplotlib做出來的,說白了就是醜matplotlib在習慣了之後特別舒適,只要copy一下代碼再改參數就可以得到類似的圖,並且可以實現數據與作圖功能的分離,實現自動化作圖與重複性作圖代碼塊作圖可以明確哪個代碼管圖層的哪個部分,適合精細化作圖Mac沒有Origin,每次做個圖要打開虛擬機,佔用資源過多,有點不爽不過自從我真的拋下偏見去用一用Origin,情況完全就不一樣了....
無教程盲摸,不到半小時,一張符合要求的極坐標圖就出來了....
這可怎麼的了啊....去年八月的時候在老闆面前用py作圖被老闆說「你Origin遲早要學的」,當時不以為然,沒想到這圖形界面一用起來居然這麼上手啊...這就是命令行用久了的人嘛....
現在覺得:嗯,真香.jpg
至於「必須要開虛擬機」....在家這幾天我想想我都用虛擬機玩過些啥了
魔獸爭霸+DOTA(把百度網盤裡面的老遊戲搞了下來)甚至還拿虛擬機跑高斯和Castep的計算任務....
好像也沒啥啊,16G內存完全帶的起...本來機子就是要生產力啊...
逐漸沒有理由拒絕Origin了...而且Origin裡面的曲線擬合模型在使用上明顯比matlab和py來得簡單方便實用...python和matlab最大的好處就是代碼系統的可遷移重複性,但對於只需要進行一次作圖的任務來說目前感覺Origin的便捷度和可調性都是可以的...而且Origin9的解析度已經不比matplotlib差到哪去了...
雖然目前還不會很精細的調整——因為我還沒系統學過
不過,上面那樣的作圖代碼從開始到完成到優化到最終出結果一般都要四五個小時...而熟練了Origin之後應該也就半小時的事情...
好了,讓旅途逐漸開始吧
關注我,後臺回復Origin,可以得到Origin軟體包與系列教程哦
行道之人,總得時不時,跳出舒適圈,努力向外走。
哦對了,這裡要致謝Rika,mdnice是真的香啊(笑)
歡迎大家繼續與我多多交流啦
我知道你在看哦👀💖