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

请问用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  
    
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?