小编Lev*_*wan的帖子

Python Matplotlib底图在地图上覆盖小图像

我正在绘制地图上的飞机数据,我想在绘图上最新数据点的坐标处插入这个75px乘29px的飞机PNG图像.

飞机http://i45.tinypic.com/mslr86.jpg

据我所知并已阅读,pyplot.imshow()是实现这一目标的最佳方式.但是,我在第1步被挂起,让图像均匀显示.使用普通图而不是Basemap,使用imshow很容易让图像显示,但是当使用Basemap时,我根本无法显示它.请参阅示例代码.

如果我可以将图像显示在地图上,我假设我可以通过反复试验,使用extent属性为其设置其位置和一些适当的尺寸imshow(),其中绘图坐标从地图坐标转换而来x,y = m(lons,lats).

这是示例代码(尝试它可能需要下载上面的飞机图像).

from matplotlib import pyplot as plt
from mpl_toolkits.basemap import Basemap
import Image
from numpy import arange

lats = arange(26,29,0.5)
lons = arange(-90,-87,0.5)

m = Basemap(projection='cyl',llcrnrlon=min(lons)-2,llcrnrlat=min(lats)-2,
            urcrnrlon=max(lons)+2,urcrnrlat=max(lats)+2,resolution='i')

x,y = m(lons,lats)
u,v, = arange(0,51,10),arange(0,51,10)
barbs = m.barbs(x,y,u,v)
m.drawcoastlines(); m.drawcountries(); m.drawstates()

img = Image.open('c130j_75px.png')
im = plt.imshow(img, extent=(x[-1],x[-1]+50000,y[-1],y[-1]+50000))
plt.show()
Run Code Online (Sandbox Code Playgroud)

这是生成的图像,不包含飞机的痕迹.我尝试了几种不同的尺寸extent,以为我可能只是把它做得太小,但没有成功.我也尝试过设置zorder=10,但也没有运气.任何帮助,将不胜感激.

结果http://i45.tinypic.com/35mgnev.jpg

更新:我现在可以通过使用m.imshow代替来显示图像plt.imshow,因为前者在地图的轴实例中传递,但extent参数似乎对图像的尺寸没有影响,因为它总是填满整个图无论我的extent尺寸有多小,即使我将它们设置为零.如何适当缩放飞机图像并将其定位在最后一个数据点附近?

im = m.imshow(img, extent=(x[-1],x[-1]+5,y[-1],y[-1]+2)) …

python overlay image matplotlib matplotlib-basemap

27
推荐指数
2
解决办法
1万
查看次数

Python matplotlib更改超出颜色条范围的值的默认颜色

当使用颜色填充网格时,例如在pyplot中使用contourf时,我需要找到一种方法来更改pyplot用于填充超出颜色条指定范围的数据的颜色.我希望有一个静态颜色条不会自动更改其范围以适应数据的最大/最小值,因此偶尔会超出其边界的极值是不可避免的,并且需要为这些值指定颜色.

超出颜色条边界的值的默认颜色为白色,如果颜色图的最终颜色不是白色,则可能与周围数据明显冲突.示例图像如下所示 - 当值超出颜色条的负范围时,请注意白色填充:

在此输入图像描述

我相信有一种方法可以指定在每个边界使用哪种颜色,如果超过它们使用rcParams,但我无法在任何地方找到相关信息.

任何帮助,将不胜感激.

python matplotlib contour color-mapping colorbar

23
推荐指数
1
解决办法
3万
查看次数

子类化logging.Formatter更改logging.Formatter的默认行为

我向记录器添加了两个具有不同格式化程序的处理程序。第一个需要子类化logging.Formatter来进行自定义格式化。默认格式化程序足以满足第二个处理程序的需要。

假设第一个格式化程序只是从消息中删除换行符。以下脚本说明了看似奇怪的行为:

import logging

logger = logging.getLogger(__name__)

class CustomFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
    def format(self, record):
        record.msg = record.msg.strip().replace('\n', ' ')
        return super().format(record)

h1 = logging.StreamHandler()
formatter1 = CustomFormatter(fmt=None, datefmt=None)
h1.setFormatter(formatter1)
logger.addHandler(h1)

h2 = logging.StreamHandler()
formatter2 = logging.Formatter(fmt=None, datefmt=None)
h2.setFormatter(formatter2)
logger.addHandler(h2)

logger.warning('string with\nmultiple lines')
Run Code Online (Sandbox Code Playgroud)

输出如下:

string with multiple lines
string with multiple lines
Run Code Online (Sandbox Code Playgroud)

我期望的是这个:

string with multiple lines
string with 
multiple lines
Run Code Online (Sandbox Code Playgroud)

第二个格式化程序不应实现 的行为CustomFormatter,但它确实实现了。当我反转处理程序添加到记录器的顺序时,这种情况不会发生。

除非我误解了子类化,否则不应通过重写子类中的方法来更改基类的行为。当我重写除 之外的类的方法时,这似乎不是问题logging.Formatter

这是日志记录模块中的错误,还是我在这里遗漏了一些东西?

python logging subclass python-3.x python-logging

6
推荐指数
1
解决办法
2389
查看次数