GVKun编程网logo

如何在matplotlib.pyplot.imshow中使用“范围”(from matplotlib import pyplot)

10

如果您想了解如何在matplotlib.pyplot.imshow中使用“范围”和frommatplotlibimportpyplot的知识,那么本篇文章将是您的不二之选。我们将深入剖析如何在matp

如果您想了解如何在matplotlib.pyplot.imshow中使用“范围”from matplotlib import pyplot的知识,那么本篇文章将是您的不二之选。我们将深入剖析如何在matplotlib.pyplot.imshow中使用“范围”的各个方面,并为您解答from matplotlib import pyplot的疑在这篇文章中,我们将为您介绍如何在matplotlib.pyplot.imshow中使用“范围”的相关知识,同时也会详细的解释from matplotlib import pyplot的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

如何在matplotlib.pyplot.imshow中使用“范围”(from matplotlib import pyplot)

如何在matplotlib.pyplot.imshow中使用“范围”(from matplotlib import pyplot)

我设法绘制了数据,并想为其添加背景图像(地图)。数据是按长/纬度值绘制的,我也具有图像三个角(左上角,右上角和左下角)的长/纬度值。

我试图弄清楚如何在imshow中使用’extent’选项。但是,我发现的示例并未说明如何为每个角指定x和y(在我的情况下,我具有三个角的信息)。

将图像添加到绘图中时,如何为图像指定三个角的位置?

谢谢

答案1

小编典典

在当前轴的坐标中指定要粘贴图像的矩形的角

范围定义了左右限制,以及上下限制。它需要四个值,如下所示:extent=[horizontal_min,horizontal_max,vertical_min,vertical_max]

假设您在水平轴上有经度,请使用extent=[longitude_top_left,longitude_top_right,latitude_bottom_left,latitude_top_left]。longitude_top_left和longitude_bottom_left应该相同,latitude_top_left和latitude_top_right应该相同,并且这些对中的值可以互换。

如果图像的第一个元素应绘制在左下方,则也应使用origin=''lower''imshow选项,否则,您需要使用“上”默认值。

import matplotlib.pyplot as plt出错

import matplotlib.pyplot as plt出错

>>>import matplotlib.pyplot as plt
/usr/lib/python2.7/dist-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment. warnings.warn(''Matplotlib is building the font cache using fc-list. This may take a moment.'')

在第八讲中,导入这个模块出错
解决:

找到缓存目录 删除~/.cache/matplotlib下面的缓存

 deleted ~/.cache/matplotlib/fontList.cache

但是,当我准备删的时候,再import matplotlib时时没有出错,不知道具体的原因是什么

matplotlib.pyplot.imshow:使用属性“ sharex”和“ sharey”时,删除图中的空白

matplotlib.pyplot.imshow:使用属性“ sharex”和“ sharey”时,删除图中的空白

我有一个问题,类似于这里发布的问题。不同之处在于,当我绘制两个通过sharexsharey属性共享轴的子图时,在图区域内会出现多余的空白。设置后,空白仍然存在autoscale(False)。例如,使用与上述帖子的答案类似的代码:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(2,1,1)
ax.imshow(np.random.random((10,10)))
ax.autoscale(False)
ax2 = fig.add_subplot(2,2,sharex=ax,sharey=ax)   # adding sharex and sharey
ax2.imshow(np.random.random((10,10)))
ax2.autoscale(False)
plt.show()

产生此图像。

我也尝试过了,ax.set_xlim(0,10)ax.set_xbound(0,10)按照这里的建议,但无济于事。如何摆脱多余的空格?任何想法,将不胜感激。

OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现

OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现

一、问题

在Python里使用OpenCV时,一般是通过cv2.imread读入图片,然后用plt.imshow显示图片,但最近学习OpenCV时这样做的结果与预期的结果有较大的出入。查找资料后,才明白OpenCV里的imshow()和Matplotlib.pyplot的imshow()在使用上有一些区别,不注意的话很容易就会导致很奇怪的结果。

下面的示例代码及运行结果显示了这种差异:

import cv2
import matplotlib.pyplot as plt

#以灰度模式读入图片
messi=cv2.imread('messi.jpg',0)

#使用matplotlib.pyplot的imshow显示图片
plt.imshow(messi),plt.title('messi_plt')
plt.xticks([]),plt.yticks([]) #隐藏坐标轴
plt.show()

#使用opencv的imshow显示图片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下:

OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现


左边是原图,中间是cv2.imshow的显示结果,右边是plt.imshow的显示结果。很明显地看到,明明是读入灰度图,plt.imshow的结果却更像是张彩图,这显然是有问题的。

二、分析和解决办法

为了比较和分析OpenCV里imshow()和Matplotlib.pyplot里imshow()这两者的差异,下面分别对显示彩图以及显示灰度图这两种情况来进行说明。

彩色图

对于彩色图片,一般由R,G,B三个通道构成。然而,需要注意的是,OpenCV里彩色图片加载时是按照BGR的顺序,Matplotlib里彩色图片加载时是按照RGB的顺序。所以,当我们用cv2.imread读入图片,用cv2.imshow来显示时自然是不会出问题的,但若用plt.imshow来显示就会出现问题,如下面的结果所示。
这里省略示例代码(和上面的几乎相同,只是不要在cv2.imread里设置“0”这个参数即可),运行结果如下:

OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现


左边是原图,中间是cv2.imshow的显示结果,右边是plt.imshow的显示结果。显然,plt.imshow的结果出现了问题。
为了解决这个问题,方法很简单,就是将通道R和通道B的内容调换一下,再用plt.imshow显示时就正常了。下面给出该方法的示例代码:

import cv2
import matplotlib.pyplot as plt

#读入彩色图片
messi=cv2.imread('messi.jpg',1)

#使用matplotlib.pyplot的imshow显示图片
plt.imshow(messi),plt.yticks([]) #隐藏坐标轴
plt.show()

##调换r、b通道,生成rgb顺序的图片并显示
b,g,r=cv2.split(messi) #通道的拆分
messi_rgb=cv2.merge((r,b)) #通道的融合
plt.imshow(messi_rgb),plt.title('messi_rgb_plt')
plt.xticks([]),plt.yticks([])
plt.show()

#使用opencv的imshow显示图片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

灰度图

灰度图是单通道图片,按理说不会出现上面彩色图的那种问题,不管是用cv2.imshow显示还是用plt.imshow显示,结果都应该是一样的。然而,事实却并非如此(如最开始的示例所示)。我纠结了好久不知道原因是什么,一开始以为是opencv和matplotlib的版本不匹配,结果更新版本之后还是有这个问题。后来,去找来matplotlib的api文档才明白是咋回事。
matplotlib.pyplot.imshow函数里,有一个参数是cmap,api文档里给出的说明是:

cmap : str or Colormap,optional
The Colormap instance or registered colormap name used to map scalar data to colors. This parameter is ignored for RGB(A) data. Defaults to rcParams[“image.cmap”] = ‘viridis'.

大致的意思是说,cmap给出了标量值如何映射到颜色空间,并且对于RGB(A)图像此参数是忽略的;默认参数可查看rcParams[“image.cmap”]。链接转过去的文档是matplotlib的示例配置文档matplotlibrc,里面定义了各种变量的默认值(这也是为什么我们在调用matplotlib里的函数时,有些参数我们没给值也能正常运行的原因)。在这里能看到,cmap的默认值是viridis,这也就说明了在使用plt.imshow显示灰度图时出现问题的原因。

因此,为了解决该问题,使plt.imshow能正常地显示灰度图,方法也很简单,就是修改cmap的值为'gray'。示例代码如下:

import cv2
import matplotlib.pyplot as plt

#读入彩色图片
messi=cv2.imread('messi.jpg',0)

#使用opencv的imshow显示图片
cv2.imshow('messi_cv',messi)
cv2.waitKey(0)
cv2.destroyAllWindows()

#使用matplotlib.pyplot的imshow显示图片
#cmap使用默认值
plt.imshow(messi),plt.title('messi_camp_default')
plt.xticks([]),plt.yticks([]) #隐藏坐标轴
plt.show()

#使用matplotlib.pyplot的imshow显示图片
#cmap设置为'gray'
plt.imshow(messi,cmap='gray'),plt.title('messi_camp_gray')
plt.xticks([]),plt.yticks([]) #隐藏坐标轴
plt.show()

运行结果为:

OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现


左边是cv2.imshow的显示结果,中间和右边的是plt.imshow的显示结果。

另外,cmap的值除了可以取默认参数及'gray'外,还有很多值可供我们选择,详细的说明在这里。其实这些东西了解下就行,等实际使用时,查阅下、试一试。根据需要选择合适的就可以了。

注:
1.关于matplotlib里的imshow函数更详细的说明在这里。
2.关于matplotlib.matplotlibrc文档更详细的说明在这里。
3.如果想查看或编辑自己电脑里的matplotlibrc文件,可使用此命令matplotlib.matplotlib_fname()获取路径。

三、总结

由于OpenCV里的imshow和Matplotlib里的imshow的一些差异,在使用时主要是要注意两点:
1.显示彩色图时,要把b、r通道调换一下。
2.显示灰度图时,记得设置cmap的值为'gray'。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

python – matplotlib imshow subplots sharey break x limits

python – matplotlib imshow subplots sharey break x limits

我正在使用matplotlib绘制一系列热图.没有共享的y轴,它可以正常工作.当我尝试分享y轴时,我遇到了一个问题. x轴限制似乎受到严重影响.

考虑以下MWE:

import matplotlib
print matplotlib.__version__ # prints "1.4.2"

import matplotlib.pyplot as plt

data = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

nrows,ncols = 1,4
fig,axes = plt.subplots(nrows,ncols,sharey=True)

for j in range(ncols):
    xs = axes[j]

    # seems to have no impact when sharey=True
    #xs.set_xlim(-0.5,2.5)

    xs.imshow(data,interpolation=''none'')   
plt.show()

输出的错误输出如下:

只是简单地将sharey = True更改为sharey = False会产生正确的输出(除了我希望y轴在当然是共享的,现在它不是):

有没有办法来解决这个问题?

解决方法

从 here得到答案:

ax.set_adjustable(''Box-forced'')

所以:

for j in range(ncols):
    xs = axes[j]
    xs.set_adjustable(''Box-forced'')   
    xs.imshow(data,interpolation=''none'')

这似乎是有意的行为,您需要指定这一点来协调imshow()在单个绘图上的行为与其在子绘图上的行为之间的差异.

今天关于如何在matplotlib.pyplot.imshow中使用“范围”from matplotlib import pyplot的分享就到这里,希望大家有所收获,若想了解更多关于import matplotlib.pyplot as plt出错、matplotlib.pyplot.imshow:使用属性“ sharex”和“ sharey”时,删除图中的空白、OpenCV里的imshow()和Matplotlib.pyplot的imshow()的实现、python – matplotlib imshow subplots sharey break x limits等相关知识,可以在本站进行查询。

本文标签: