导航:首页 > 编程语言 > 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气象绘图相关的资料

热点内容
安卓手机电话簿怎么导出到苹果手机 浏览:763
php实现投票 浏览:333
手机爆力解压加密视频文件 浏览:932
东方财富app怎么看北上资金图解 浏览:418
邢昭林程序员那么可爱拍现场 浏览:169
安卓什么应用可以免费看电视剧 浏览:504
合适pdf 浏览:293
app监测睡眠怎么选择 浏览:642
老人家用什么安卓手机好 浏览:955
解压包能不能送女朋友 浏览:701
好看发卡网源码 浏览:51
水平集算法matlab 浏览:770
局域网如何用ftp服务器配置 浏览:76
程序员惯性思考模式 浏览:443
如何在个税app上查身份证号 浏览:8
电视家app安装在电视上怎么安 浏览:891
怎么将pdf格式转化为图片格式 浏览:639
服务器拔掉raid卡怎么装系统 浏览:234
区域对称加密算法 浏览:247
数字转汉字php 浏览:735