【问题标题】:netCDF4-Python Plotting variablesnetCDF4-Python 绘图变量
【发布时间】:2018-04-30 06:35:23
【问题描述】:

我想使用 netCDF4-Python 从 netCDF 文件中绘制变量选择。我正在使用以下代码:

import numpy as np
import pandas as pd
from pylab import *
from netCDF4 import Dataset
pals = Dataset('pals_amplero_2003_2006_ecmwf_v1.nc4', "a",format='NETCDF4')
print (pals.variables.keys())
print (pals.variables['Rainf'])
print (pals.variables['Evap'])
print (pals.variables['time'])
evap = pals.variables['Evap'][:,:]
rain = pals.variables['Rainf'][:,:]
subplot(2,1,1)
pcolor(evap)
subplot(2,1,2)
pcolor(rain)

不幸的是,它输出了一条错误消息(在随附的文档中更详细):

ValueError: too many values to unpack (expected 2)

以下是打印命令的输出信息

odict_keys(['DelIntercept', 'DelSWE', 'DelSoilMoist', 'Evap', 'Qs', 'Qsb',      'Qsm', 'Rainf', 'Snowf', 'lat', 'lon', 'nlevs', 'time', 'timestp', 'M_fieldcap', 'M_sat', 'M_wilt', 'SoilDepth', 'CanopInt', 'Conds', 'ECanop', 'ESoil', 'RootMoist', 'SubSnow', 'TVeg', 'DelColdCont', 'DelSoilHeat', 'LWnet', 'LWup', 'Qf', 'Qg', 'Qh', 'Qle', 'SWnet', 'Fdepth', 'HFLUXRF', 'IceFrac', 'MFLUXRF', 'SAlbedo', 'SnowDepth', 'SnowFrac', 'Tdepth', 'WSN', 'AvgSurfT', 'HLICE', 'HLML', 'SWE', 'SnowT', 'SoilMoist', 'SoilTemp', 'TLBOT', 'TLICE', 'TLMNW', 'TLSF', 'TLWML', 'icetemp', 'snowdens', 'Albedo', 'BaresoilT', 'RH2m', 'RadT', 'T2m', 'VegT', 'Bgain', 'Biomstr', 'Biomstr2', 'Bloss', 'biomass', 'lai', 'Ag', 'An', 'CO2flux', 'Rd', 'Reco', 'Rsoil_str'])
<class 'netCDF4._netCDF4.Variable'>
float32 Rainf(time, y, x)
units: mm/day
long_name: Rainfall rate
associate: time y x
missing_value: 1e+20
time_representation: average over past model timestep
unlimited dimensions: time
current shape = (70084, 1, 1)
filling on, default _FillValue of 9.969209968386869e+36 used

<class 'netCDF4._netCDF4.Variable'>
float32 Evap(time, y, x)
units: mm/day
long_name: Total evapotranspiration
associate: time y x
missing_value: 1e+20
time_representation: average over past model timestep
unlimited dimensions: time
current shape = (70084, 1, 1)
filling on, default _FillValue of 9.969209968386869e+36 used

<class 'netCDF4._netCDF4.Variable'>
float64 time(time)
units: seconds since 2003-01-01 00:00:00
long_name: Time in seconds
Time_label: Start of output interval
unlimited dimensions: time
current shape = (70084,)
filling on, default _FillValue of 9.969209968386869e+36 used

【问题讨论】:

  • 你没有显示你在哪里/如何阅读prec。通常你的代码应该可以工作;例如evap 在 NetCDF 文件中有一个三维形状,但您将 ([:,:]) 前两个维度切出,所以这应该适用于 pcolor。可能是prec 有两个以上的维度。
  • 感谢您的回答!实际上,您在我的代码中指出了一个错误,没有变量“prec”。只有“evap”和“rain”,它们都有 3 个维度,我使用 [:,:] 切片我只是不明白错误!
  • 我也没有。能否添加完整的错误信息(至少包括导致错误的行)?
  • 好的!我现在用完整的错误消息重新编辑我的问题。谢谢!

标签: python plot netcdf


【解决方案1】:

终于看到问题了。举个例子(一个随机的 NetCDF 文件):

ncdump -h th.xz.nc

给予(除其他外):

float th(time, z, x, y) ;

所以变量 th 有 4 个维度。如果您以与代码类似的方式阅读/绘制此内容:

import netCDF4 as nc4
import matplotlib.pylab as pl

nc = nc4.Dataset('th.xz.nc')
th = nc.variables['th'][:,:]

pl.figure()
pl.pcolor(th)

它给出了同样的错误:

ValueError:解包的值太多(预计 2 个)

为什么?使用[:,:](或[:],或[:,:,:])的切片仍然会给你两个以上的维度:

print(th.shape)

(9, 32, 32, 1)

pcolor 需要一个二维数组。解决方法很简单;您需要选择要显示的二维切片,例如pcolor(evap[0,:,:])x-y切片)或pcolor(evap[:,0,:])time-x切片),或...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2021-11-15
    • 2017-09-06
    • 1970-01-01
    • 2017-08-27
    • 2012-07-29
    • 1970-01-01
    相关资源
    最近更新 更多