莫眉 2017-12-02 02:58 采纳率: 0%
浏览 3506

请问用Python的matplotlib可以将特定区域的陆地透明化,海洋根据数值进行上色,然后出图吗

from scipy.stats.kde import gaussian_kde
import numpy
from scipy.io import netcdf
import gdal

from gdalconst import *
#import numpy,osr,sys
import netCDF4
import pdb
import datetime
from scipy import interpolate

import scipy.io as sio

import matplotlib.pyplot as plt

from mpl_toolkits.basemap import Basemap ,shiftgrid

import numpy as np

import math
#import seawater as sw
from scipy import interpolate
from math import radians, cos, sin, asin, sqrt
import netCDF4
import glob
import os
import datetime
from matplotlib.path import Path
from collections import Counter

data=netCDF4.Dataset(os.path.join('E:\HYcom1\uv\uv1\hycom_glb_911_2016010100_t000_uv3z.nc'))
latitudes = data.variables['lat'][1188:1626]
longitudes = data.variables['lon'][750:2063]
lons, lats = np.meshgrid(longitudes,latitudes)
v=np.zeros([438,1313])#空的二维数组
u=np.zeros([438,1313])#空的二维数组
gird= [[0 for col in range(1313)] for row in range(438)]
k=0
tempv=data.variables['water_v'][0][k]
tempu=data.variables['water_u'][0][k]
#k=4
for i in range(1188,1626):
for j in range(750,2063):
if math.isnan(tempv[i][j]):
v[i-1188][j-750]=0
else:
v[i-1188][j-750]=tempv[i][j]
if math.isnan(tempu[i][j]):
u[i-1188][j-750]=0
else:
u[i-1188][j-750]=tempu[i][j]
#将为nan的数值赋值为0
for i in range(0,438):#当分辨率改变时需要改变
for j in range(0,1313):
gird[i][j]=math.sqrt(u[i][j]*u[i][j]+v[i][j]*v[i][j])
#格网数据标量化
for i in range (1,438,2):
for j in range (1,1313,2):
gird[i-1][j-1]=(gird[i-1][j-1]+gird[i-1][j]+gird[i][j-1]+gird[i][j])/4
for i in range (0,438):
for j in range (0,1313):
gird[i][j]=gird[int(i/2)*2][int(j/2)*2]
#双for循环,第一个将范围内的平均值存在左上角的位置,第二个将左上角的数据赋值所选范围内
gird= np.array(gird)
m = Basemap(llcrnrlon=60,urcrnrlon=165,llcrnrlat=15,urcrnrlat=50)
fig = plt.figure(edgecolor='none',frameon='false')#1124 figsize=(8,4),dpi=20
fig.set_size_inches(64,21.4)
x, y = m(lons, lats)
m.bluemarble()
m.pcolor(x,y,gird,cmap=plt.cm.RdBu_r)
m.fillcontinents(color='#CCCCCC',lake_color='#CCCCCC')#,alpha=0.0
plt.subplots_adjust(top=1,bottom=0,left=0,right=1,hspace=0,wspace=0)#输出图像边框设置
plt.savefig(os.path.join(r'E:\34\prectice\1202\'+'64214.png'))
plt.close()

以上是代码,其中读取NC数据,将特定区域的信息进行提取,进行绘图,但是最终需要的是陆地透明化的图片说明
而我出图只能出成这样的图片说明
不知在Python中是否有操作可以是陆地透明化,亦或者陆地填充成NASA的地图图片也可以,但是海洋地区一定是要根据处理出来的值来画的!求解~~~

  • 写回答

1条回答 默认 最新

  • shuimoyichen 2018-01-11 01:58
    关注

    这个方法是一个神奇的方法,你可以将一个图片(与原图尺寸相同)写入到原图片的透明通道中,而不影响原图片的正常显示,可以用于信息隐藏哦。当然,前提是原
    始图片有透明通道。不过就算不是也没有多大关系,因为有PIL提供的convert功能,可以把一个图片先转换成RGBA模式,然后把要隐藏的信息文件转成“L”或者“1”模
    式,最后使用这个putalpha将其叠加。而在图片的使用方,只需要简单的抽取其中的透明通道就可以看到隐藏信息了,哈哈。
    Python代码 收藏代码
    def hideInfoInImage(img, info):

    if img.mode != "RGBA":

    img = img.convert("RGBA")

    if info.mode != "L" and info.mode != "1":

    info = info.convert("L")

    img.putalpha(info)

    return img  
    
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 急matlab编程仿真二阶震荡系统
  • ¥20 TEC-9的数据通路实验
  • ¥15 ue5 .3之前好好的现在只要是激活关卡就会崩溃
  • ¥50 MATLAB实现圆柱体容器内球形颗粒堆积
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件