導航:首頁 > 編程語言 > python3氣象繪圖

python3氣象繪圖

發布時間:2023-07-05 00:48:22

python氣象繪圖windrose

#導入包

import numpy as np

import pandas as pd

from matplotlib import pyplot as plt

from matplotlib.ticker import FuncFormatter

import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  #設置簡黑字體

mpl.rcParams['axes.unicode_minus'] = False  #設置負號正常顯示

#----獲取數據DataFrames,index*columns。index表示不同值范圍,columns表示十六個風向

data = pd.DataFrame(wind_d_max_num_per,

                    index=['<15', '15~25', '25~35', '35~45',"≥45"],

                    columns='N NNE NE ENE E ESE SE SSE S SSW SW WSW W WNW NW NNW'.split())

N = 16 # 風速分布為16個方向

theta = np.linspace(0, 2*np.pi, N, endpoint=False) # 獲取16個方向的如手角度值

width = np.pi / 4 * 0.4  # 繪制扇型的寬度,可以自行調整0.5時是360,充滿,有間隔的話小於0.5即可

labels = list(data.columns) # 自定義坐標標簽為 N , NSN, …渣笑嫌…# 開始繪圖

plt.figure(figsize=(6,6),dpi=600)

ax = plt.subplot(111, projection='polar')

#----自定義顏色

mycolor =['cornflowerblue','orange','mediumseagreen','lightcoral','cyan']

#----循環畫風玫瑰圖

i=0

for idx in data.index:

    print(idx)

    # 每一行繪制一個扇形

    radii = data.loc[idx] # 每一行數據

    if i == 0:

        ax.bar(theta, radii, width=width, bottom=0.0, label=idx, tick_label=labels,

          color=mycolor[i])

    else:

        ax.bar(theta, radii, width=width, bottom=np.sum(data.loc[data.index[0:i]]), label=idx, tick_label=labels,

          color=mycolor[i])

    i=i+1

#此種畫法,注意bottom設置,第一個bottom為0,後續bottom需要在前一個基礎上增加。

ax.set_xticks(theta)

ax.set_xticklabels(labels,fontdict={'weight':'bold','size':15,'color':'k'})

ax.set_theta_zero_location('N') #設置零度方向北

ax.set_theta_direction(-1)    # 逆時針方向繪圖

#----設置y坐標軸以百分升則數顯示

plt.gca().yaxis.set_major_formatter(FuncFormatter(lambda s, position: '{:.0f}%'.format(100*s)))

plt.legend(loc=4, bbox_to_anchor=(0.05, -0.25),fontsize=12) # 將label顯示出來, 並調整位置

#----保存圖片

plt.savefig("./windrose1.svg")

Ⅱ Python氣象數據處理與繪圖(2):常用數據計算方法

對於氣象繪圖來講,第一步是對數據的處理,通過各類公式,或者統計方法將原始數據處理為目標數據。
按照氣象統計課程的內容,我給出了一些常用到的統計方法的對應函數:

在計算氣候態,區域平均時均要使用到求均值函數,對應NCL中的dim_average函數,在python中通常使用np.mean()函數
numpy.mean(a, axis, dtype)
假設a為[time,lat,lon]的數據,那麼

需要特別注意的是,氣象數據中常有缺測,在NCL中,使用求均值函數會自動略過,而在python中,當任意一數與缺測(np.nan)計算的結果均為np.nan,比如求[1,2,3,4,np.nan]的平均值,結果為np.nan
因此,當數據存在缺測數據時,通常使用np.nanmean()函數,用法同上,此時[1,2,3,4,np.nan]的平均值為(1+2+3+4)/4 = 2.5
同樣的,求某數組最大最小值時也有np.nanmax(), np.nanmin()函數來補充np.max(), np.min()的不足。
其他很多np的計算函數也可以通過在前邊加『nan』來使用。
另外,

也可以直接將a中缺失值全部填充為0。

np.std(a, axis, dtype)
用法同np.mean()

在NCL中有直接求數據標准化的函數dim_standardize()

其實也就是一行的事,根據需要指定維度即可。

皮爾遜相關系數:

相關可以說是氣象科研中最常用的方法之一了,numpy函數中的np.corrcoef(x, y)就可以實現相關計算。但是在這里我推薦scipy.stats中的函數來計算相關系數:

這個函數缺點和有點都很明顯,優點是可以直接返回相關系數R及其P值,這避免了我們進一步計算置信度。而缺點則是該函數只支持兩個一維數組的計算,也就是說當我們需要計算一個場和一個序列的相關時,我們需要循環來實現。

其中a[time,lat,lon],b[time]

(NCL中為regcoef()函數)
同樣推薦Scipy庫中的stats.linregress(x,y)函數:

slop: 回歸斜率
intercept:回歸截距
r_value: 相關系數
p_value: P值
std_err: 估計標准誤差
直接可以輸出P值,同樣省去了做置信度檢驗的過程,遺憾的是仍需同相關系數一樣循環計算。

Ⅲ Python氣象數據處理與繪圖(12):軌跡(台風路徑,寒潮路徑,水汽軌跡)繪制

寒潮是筆者主要的研究方向,寒潮路徑作為寒潮重要的特徵,是寒潮預報的重點之一,同樣的道理也適用在台風研究以及降水的水汽來源研究中。關於路徑的計算以及獲取方法(比如軌跡倒推,模型追蹤等等方法,台風有自己現成的數據集,比如ibtracs數據集等等)並不在本文的介紹范圍之內,本文主要介紹在獲取了相應的路徑坐標後,如何在圖中美觀的展現。

上圖展現了近40年東北亞區域的冬季冷空氣活動路徑,繪制這類圖需要的數據只需為每條路徑的N個三維坐標點,第一第二維分別為longitude和latitudee,第三維則比較隨意,根據需要選擇,比如說需要體現高度,那就用高度坐標,需要體現冷空氣強度,那就用溫度數據,水汽可以用相對濕度,台風也可以用速度等等。
通常此類數據是由.txt(.csv)等格式存儲的,讀取和處理方法可參考我的「Python氣象數據處理與繪圖(1):數據讀取」,本文主要介紹繪圖部分。

當然根據需要,也可以直接繪制兩維的軌跡,即取消掉顏色數組,用最簡單的plot語句,循環繪制即可。

有一個陷阱需要大家注意的是,當軌跡跨越了東西半球時,即穿越了0°或者360°經線時,它的連接方式是反向繞一圈,比如下圖所示,你想要藍色的軌跡,然而很有可能得到綠色的,這是因為你的網格數組的邊界是斷點,系統不會自動識別最短路徑,只會在數組中直接想連,因為這不是循環數組。

我目前的解決辦法是這樣的:如果你的數據是0°-360°格式,那麼變為-180°-180°的格式,反之相互轉換。但是如果你的數據兩種都出現了斷點,也就是繞了地球一圈多,那無論怎樣都么得辦法了,我目前的思路是將數據轉換成極坐標數據格式,理論上是可行的,CARTOPY的繪圖也是支持極坐標數據的,具體實施還需要再試試。

Ⅳ Python氣象數據處理與繪圖(1):數據讀取

python很多庫支持了對nc格式文件的讀取,比如NetCDF4,PyNio(PyNio和PyNgl可以看做是NCL的Python版本)以及Xarray等等。

我最初使用PyNio,但是由於NCL到Python的移植並不完全,導致目前遠不如直接使用NCL方便,而在接觸Xarray庫後,發現其功能強大遠超NCL(也可能是我NCL太菜的原因)。

安裝同其它庫一致:

我這里以一套中國逐日最高溫度格點資料(CN05.1)為例,其水平精度為0.5°X0.5°。

可以看到,文件的坐標有時間, 經度,緯度,變數有日最高溫
我們將最高溫數據取出

這與Linux系統中的ncl_filemp指令看到的信息是類似的
Xarray在讀取坐標信息時,自動將時間坐標讀取為了datetime64 格式,這對我們挑選目的時間十分方便。Xarray通常與pandas配合使用。
比如我們想選取1979.06.01-1979.06.20時期數據,我們只需

再比如我們想選取夏季數據時,只需

更多的時間操作同python的datetime函數類似。
當我們想選取特定經緯度范圍(高度)的數據時,.loc[]函數同樣可以解決。
在這里,我選取了40°N-55°N,115°E-135°E范圍的數據

甚至,我們還可以套娃,同時疊加時間和范圍的選取

這足夠滿足常用到的數據索引要求。

對於這類簡單排列的.txt文件,可以通過np.load讀取,用pandas的.read_csv更為方便

讀取txt的同時,對每列賦予了一個列名,通過data.a可以直接按列名調用相應數據。
對於較復雜的.txt文件,仍可通過該函數讀取

skiprows=5跳過了前5行的文件頭,sep='\s+'定義了數據間隔為空格,這里用的是正則表達。
pd.read_csv函數有很多的參數,可以處理各種復雜情況下的文本文件讀取。

grib文件可通過pygrib庫讀取
import pygrib
f = pygrib.open('xxx.grb')

Ⅳ Python氣象數據處理與繪圖(4):顯著性檢驗

其實在(2)中已經提到了相關系數和回歸系數,在計算過程中,直接返回了對應的p-value,因此可以直接使用p-value。

計算兩個獨立樣本得分均值的T檢驗。
這是對兩個獨立樣本具有相同平均值(預期值)的零假設的雙邊檢驗。此測試假設默認情況下總體具有相同的方差。在合成分析中通常用到t-test。

當a,b為變數場時,即[time,lat,lon]時,a,b兩個數組的經緯度需相同。
nan_policy 可選{『propagate』, 『raise』, 『omit』}
「propagate」:返回nan
「raise」:報錯
「omit」:執行忽略nan值的計算

計算得到的P值用於繪圖,當p<0.01時,通過99%顯著性檢驗,p<0.05,通過95%顯著性檢驗,以此類推。
圖形繪制只需在原有填色圖上疊加打點圖層,實際上打點也是特殊的圖色,只不過將顏色換成了點,實際上用到的還是contourf函數。

通過contourf對應參數調節打點圖層的細節。

Ⅵ python繪圖中的四個繪圖技巧

pre{overflow-x: auto}

技巧1: plt.subplots()

技巧2: plt.subplot()

技巧3: plt.tight_layout()

技巧4: plt.suptitle()

數據集:

讓我們導入包並更新圖表的默認設置,為圖表添加一點個人風格。 我們將在提示上使用 Seaborn 的內置數據集:

import seaborn as sns # v0.11.2   import matplotlib.pyplot as plt # v3.4.2   sns.set(style='darkgrid', context='talk', palette='rainbow')df = sns.load\_dataset('tips')   df.head()

技巧1: plt.subplots()

繪制多個子圖的一種簡單方法是使用 plt.subplots() 。

這是繪制 2 個並排子圖的示例語法:

fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(10,4))   sns.histplot(data=df, x='tip', ax=ax[0])   sns.boxplot(data=df, x='tip', ax=ax[1]);

在這里,我們在一個圖中繪制了兩個子圖。 我們可以進一步自定義每個子圖。

  例如,我們可以像這樣為清談隱每個子圖添加標題:

fig, ax = plt.subplots(1, 2, figsize=(10,4))   sns.histplot(data=df, x='tip', ax=ax[0])   ax[0].set\_title("Histogram")   sns.boxplot(data=df, x='tip', ax=ax[1])   ax[1].set\_title("Boxplot");

在循環中將所有數值變數用同一組圖表示:

numerical = df.select\_dtypes('number').columnsfor col in numerical:    fig, ax = plt.subplots(1, 2, figsize=(10,4))    sns.histplot(data=df, x=col, ax=ax[0])    sns.boxplot(data=df, x=col, ax=ax[1]); 技巧2: plt.subplot()

另一種可視化多個圖形的方法是使用 plt.subplot(), 末尾沒有 s

  語法與之前略有不同:

plt.figure(figsize=(10,4))   ax1 = plt.subplot(1,2,1)   sns.histplot(data=df, x='tip', ax=ax1)   ax2 = plt.subplot(1,2,2)   sns.boxplot(data=df, x='tip', ax=ax2);

當我們想為多個圖繪制相同類型的圖形並在單個圖中查看所有圖形,該方法特別有用:

plt.figure(figsize=(14,4))   for i, col in enumerate(numerical):    ax = plt.subplot(1, len(numerical), i+1) 侍培   sns.boxplot(data=df, x=col, ax=ax)

我們同樣能定製子圖形。例如加個 title

plt.figure(figsize=(14,4))   for i, col in enumerate(numerical):    ax = plt.subplot(1, len(numerical), i+1) 答廳   sns.boxplot(data=df, x=col, ax=ax)     ax.set\_title(f"Boxplot of {col}")

通過下面的比較,我們能更好的理解它們的相似處與不同處熟悉這兩種方法很有用,因為它們可以在不同情況下派上用場。

技巧3: plt.tight_layout()

在繪制多個圖形時,經常會看到一些子圖的標簽在它們的相鄰子圖上重疊,

如下所示:

categorical = df.select\_dtypes('category').columnsplt.figure(figsize=(8, 8))   for i, col in enumerate(categorical):    ax = plt.subplot(2, 2, i+1)    sns.countplot(data=df, x=col, ax=ax)

頂部兩個圖表的 x 軸上的變數名稱被剪掉,右側圖的 y 軸標簽與左側子圖重疊.使用 plt.tight_layout 很方便

plt.figure(figsize=(8, 8))   for i, col in enumerate(categorical):    ax = plt.subplot(2, 2, i+1)    sns.countplot(data=df, x=col, ax=ax)    plt.tight\_layout()

專業 看起來更好了。

技巧4: plt.suptitle()

真個圖形添加標題:

plt.figure(figsize=(8, 8))   for i, col in enumerate(categorical):    ax = plt.subplot(2, 2, i+1)    sns.countplot(data=df, x=col, ax=ax)    plt.suptitle('Category counts for all categorical variables')   plt.tight\_layout()

此外,您可以根據自己的喜好自定義各個圖。 例如,您仍然可以為每個子圖添加標題。

到此這篇關於python繪圖 四個繪圖技巧的文章就介紹到這了,希望大家以後多多支持!

Ⅶ 用python做一個地球圍繞太陽轉的圖形

平台: python2.7.10 + wxpython 3.0.2

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from __future__ import unicode_literals
import wx

__version__ = '0.1'
app_title = 'Temperature Translator - {}'.format(__version__)

class TempTranslator(wx.Frame):
def __init__(self, parent=None, size=(620, 200), title=app_title):
super(TempTranslator, self).__init__(parent, size=size, title=title)
self.SetMinSize(self.GetSize())
self.panel = wx.Panel(self)

self.init_layout()
self.panel.Layout()
self.Centre(wx.BOTH)
self.Show()

def init_layout(self):
font = self.GetFont()
font.SetWeight(wx.BOLD)
font.SetPointSize(15)
self.panel.SetFont(font)

vbox = wx.BoxSizer(wx.VERTICAL)
self.add_label(vbox, f2c=True)
self.f_tc1, self.c_tc1 = self.add_input(vbox, f2c=True)
self.f_tc1.Bind(wx.EVT_TEXT, self.on_f_text)

line = wx.StaticLine(self.panel, -1, style=wx.LI_HORIZONTAL)
style = wx.GROW | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT | wx.TOP
vbox.Add(line, 0, style, 5)

self.add_label(vbox, f2c=False)
self.c_tc2, self.f_tc2 = self.add_input(vbox, f2c=False)
self.c_tc2.Bind(wx.EVT_TEXT, self.on_c_text)

self.panel.SetSizer(vbox)

def add_label(self, vbox, f2c=True):
if f2c:
text1 = 'Fahrenheit'
text2 = 'Celsius'
else:
text1 = 'Celsius'
text2 = 'Fahrenheit'

hbox = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(self.panel, -1, text1, size=(-1, 30),
style=wx.ALIGN_CENTER)
hbox.Add(label, 1, wx.EXPAND, 10)

label = wx.StaticText(self.panel, -1, text2, size=(-1, 30),
style=wx.ALIGN_CENTER)
hbox.Add(label, 1, wx.EXPAND, 10)
vbox.Add(hbox, 0, wx.EXPAND, 10)

def add_input(self, vbox, f2c=True):
hbox = wx.BoxSizer(wx.HORIZONTAL)
tc1 = wx.TextCtrl(self.panel, -1, size=(260, 40), style=wx.TE_CENTER)
tc1.Bind(wx.EVT_TEXT, self.on_f_text)

label = wx.StaticText(self.panel, -1, ' = ')

tc2 = wx.TextCtrl(self.panel, -1, size=(260, 40), style=wx.TE_CENTER)

hbox.Add(tc1, 1, wx.EXPAND, 10)
hbox.Add(label, 0, wx.ALL | wx.EXPAND, 10)
hbox.Add(tc2, 1, wx.EXPAND, 10)
vbox.Add(hbox, 1, wx.EXPAND, 10)
return tc1, tc2

def on_f_text(self, evt):
f = self.f_tc1.GetValue()
self.c_tc1.SetValue('{}'.format(self.f2c(f)))

def on_c_text(self, evt):
c = self.c_tc2.GetValue()
self.f_tc2.SetValue('{}'.format(self.c2f(c)))

def f2c(self, f):
return (float(f) - 32) / 1.8 if f else ''

def c2f(self, c):
return float(c) * 1.8 + 32 if c else ''

if __name__ == '__main__':
app = wx.App()
TempTranslator()
app.MainLoop()

Ⅷ 怎樣用python畫圖

思路:

1. 確定好需要畫的圖。

2. 創建一個畫布,用來畫你需要的圖。

(1)畫布大小,可以使用默認大小,也可以自定義畫布大小。

(2)畫布背景色bgcolor()。

(3)確定起點位置。

3. 畫筆的設置。

(1)畫筆的大小,顏色。

(2)畫筆運行屬性。

二、定義畫布參數

importturtleast
t.screensize(width=None,heigh=None,bg=None)#以像素為單位,參數分別為畫布的寬,高,背景色
t.screensize()#返回默認大小(400,300)
t.Screen()#也是表示默認畫布大小,注意S大寫
t.setup(w=0.5,h=0.75,startx=None,starty=None)#w,h為整數是表示像素,為小數時表示占據電腦屏幕的比例
#startx,starty坐標表示矩形窗口左上角頂點的位置,默認為屏幕中心位置

三、定義畫筆

1、畫筆的狀態

在畫布上默認有一個坐標原點為畫布中心的坐標軸,坐標原點上有一隻面朝x軸正方向小烏龜。這里我們描述小烏龜時使用了兩個詞語:坐標原點(位置),面朝x軸正方向(方向),turtle繪圖中,就是使用位置方向描述小烏龜(畫筆)的狀態。

2、畫筆的屬性

畫筆(畫筆的屬性,顏色、畫線的寬度)

(1)turtle.pensize():設置畫筆的寬度;

(2)turtle.pencolor():沒有參數傳入,返回當前畫筆顏色,傳入參數設置畫筆顏色,可以是字元串如"green","red",也可以是RGB 3元組;

>>>pencolor('brown')
>>>tup=(0.2,0.8,0.55)
>>>pencolor(tup)
>>>pencolor()
'#33cc8c'

(3)turtle.speed(speed):設置畫筆移動速度,畫筆繪制的速度范圍[0,10]整數,數字越大越快。

相關推薦:《Python入門教程》

3、繪圖命令

操縱海龜繪圖有著許多的命令,這些命令可以劃分為3種:一種為運動命令,一種為畫筆控制命令,還有一種是全局控制命令。

(1)畫筆運動命令:

(3)全局控制命令:

四、命令詳解

turtle.circle(radius,extent=None,steps=None)

描述:以給定半徑畫圓

參數:

radius(半徑);半徑為正(負),表示圓心在畫筆的左邊(右邊)畫圓;

extent(弧度) (optional);

steps (optional) (做半徑為radius的圓的內切正多邊形,多邊形邊數為steps);

舉例:

circle(50)#整圓;
circle(50,steps=3)#三角形;
circle(120,180)#半圓

五、繪圖舉例

(1)菱形太陽花

importturtleast#turtle庫是python的內部庫,直接import使用即可
defdraw_diamond(turt):
foriinrange(1,3):
turt.forward(100)#向前走100步

希望我的回答對你有幫助

閱讀全文

與python3氣象繪圖相關的資料

熱點內容
區域網如何用ftp伺服器配置 瀏覽:70
程序員慣性思考模式 瀏覽:439
如何在個稅app上查身份證號 瀏覽:6
電視家app安裝在電視上怎麼安 瀏覽:889
怎麼將pdf格式轉化為圖片格式 瀏覽:637
伺服器拔掉raid卡怎麼裝系統 瀏覽:232
區域對稱加密演算法 瀏覽:245
數字轉漢字php 瀏覽:733
安卓源碼硬體驅動 瀏覽:208
痰證pdf 瀏覽:814
電腦怎麼把word文檔轉pdf 瀏覽:867
程序員那麼可愛有孩子了嗎 瀏覽:480
安卓文字折疊怎麼使用 瀏覽:885
創造一個app如何掙錢 瀏覽:801
php55vc11 瀏覽:642
抖音如何關閉蘋果app充值 瀏覽:332
python多個文件調用 瀏覽:792
java演算法和數據結構 瀏覽:465
糖豆視頻的文件夾 瀏覽:654
php的頭部文件一般在哪個文件里 瀏覽:560