简答

你可能想打电话:

ax.imshow(..., aspect='auto')

默认情况下,imshow会在调用轴时将轴的纵横比设置为1.这将覆盖您在创建轴时指定的任何方面.

但是,这是matplotlib中常见的混淆源.让我备份并详细解释正在发生的事情.

Matplotlib的布局模型

matplotlib中的aspect是指数据坐标中xscale和yscale的比率.它不直接控制轴的宽度和高度的比率.

有三件事可以控制matplotlib轴的“外框”的大小和形状:

>图的大小/形状(下图中以红色显示)

>图坐标中轴的指定范围(例如子图位置,如下图中的绿色所示)

> Axes用于适应固定宽高比(可调参数)的机制.

换句话说,轴总是放在图形坐标中,它们的形状/大小始终是图形的形状/大小的比例. (注意:诸如axes_grid之类的东西会在绘制时改变它以绕过这个限制.)

但是,给定轴的范围(从其子图位置或显式设置范围)不一定是它将占用的大小.根据方面和可调参数,轴将在给定范围内缩小.

为了理解一切如何相互作用,让我们在很多不同的情况下绘制一个圆圈.

没有固定方面

在基本情况下(没有为轴设置固定的纵横比),轴将填充图形坐标中分配给它的整个空间(由绿色框显示).

x和y刻度(由方面设置)可以独立更改,扭曲圆圈:

当我们调整图形的大小(交互式或图形创建)时,轴将“挤压”它:

固定纵横比,可调=’框’

但是,如果设置了绘图的纵横比(默认情况下,imshow将强制纵横比为1),则轴将调整轴外部的大小,以使x和y数据比率保持在指定的方面.

但是,要理解的一个关键点是,绘图的方面是x和y数据比例的方面.这不是绘图宽度和高度的方面.因此,如果方面为1,则圆将始终为圆.

举个例子,假设我们做过类似的事情:

fig, ax = plt.subplots()

# Plot circle, etc, then:

ax.set(xlim=[0, 10], ylim=[0, 20], aspect=1)

默认情况下,可调整为“框”.让我们看看发生了什么:

轴可以占用的最大空间由绿色框显示.但是,它必须保持相同的x和y标度.有两种方法可以实现:更改x和y限制或更改Axes边界框的形状/大小.由于Axes的可调参数设置为默认的“box”,因此Axes在其最大空间内缩小.

当我们调整图形的大小时,它将继续缩小,但是通过使轴消耗分配给轴的最大空间(绿色框)来保持x和y比例:

两个快速侧面说明:

>如果您正在使用共享轴,并希望调整=“box”,请使用adjust =“box-forced”.

>如果您想控制轴在“绿色框”内的位置,请设置轴的锚点.例如. ax.set_anchor(‘NE’)让它保持“固定”在“绿色框”的右上角,因为它调整其大小以保持纵横比.

固定宽高比,可调=“datalim”

可调节的另一个主要选项是“datalim”.

在这种情况下,matplotlib将通过更改其中一个轴限制来保持数据空间中的x和y比例. Axes将填满分配给它的整个空间.但是,如果手动设置x或y限制,则可以覆盖它们以允许轴填充分配给它的完整空间并将x / y比例保持为指定的方面.

在这种情况下,x限制设置为0-10,y限制设置为0-20,方面= 1,可调=’datalim’.请注意,y限制未被遵守:

当我们调整图形时,纵横比表示相同,但​​数据限制发生变化(在这种情况下,x限制不受尊重).

这与imshow有什么关系?

调用imshow时,默认情况下调用ax.set_aspect(1.0).因为默认情况下adjust =“box”,任何带有imshow的情节都会像上面的第3 /第4张图片一样.

例如:

但是,如果我们指定imshow(…,aspect =’auto’),则不会覆盖绘图的宽高比,并且图像将“挤压”以占用分配给Axes的完整空间:

另一方面,如果你想让像素保持“正方形”(注意:它们可能不是正方形,具体取决于范围kwarg指定的内容),你可以省略aspect =’auto’并设置可调参数相反,轴为“datalim”.

例如.

ax.imshow(data, cmap='gist_earth', interpolation='none')

ax.set(adjustable="datalim")

轴形状由图形控制

要记住的最后一部分是轴的形状/尺寸定义为图形的形状/尺寸的百分比.

因此,如果要保留轴的纵横比并在相邻子图之间具有固定的间距,则需要定义要匹配的图形的形状. plt.figaspect非常方便.它只是根据指定的宽高比或2D数组生成宽度,高度的元组(它将采用数组形状的纵横比,而不是内容).

对于你的子图的网格示例,每个子图具有恒定的2×1纵横比,你可能会考虑以下内容(注意我在这里没有使用aspect =“auto”,因为我们希望图像中的像素保持正方形):

import numpy as np

import matplotlib.pyplot as plt

nrows, ncols = 8, 12

dx, dy = 1, 2

figsize = plt.figaspect(float(dy * nrows) / float(dx * ncols))

fig, axes = plt.subplots(nrows, ncols, figsize=figsize)

for ax in axes.flat:

data = np.random.random((10*dy, 10*dx))

ax.imshow(data, interpolation='none', cmap='gray')

ax.set(xticks=[], yticks=[])

pad = 0.05 # Padding around the edge of the figure

xpad, ypad = dx * pad, dy * pad

fig.subplots_adjust(left=xpad, right=1-xpad, top=1-ypad, bottom=ypad)

plt.show()

python pyplot 宽高等比_python – 更改matplotlib中子图的宽高比相关推荐

  1. python绘制多个条形图_python – 在Matplotlib中绘制多个直方图 – 颜色或并排条形图...

    问题:在Matplotlib中绘制多个直方图时,我无法区分绘图与另一个绘图 图像问题:** **次要问题:部分左侧标签"计数"不在图像范围内.为什么? 描述 我想绘制3个不同组的直 ...

  2. python画两条曲线_python – 在Matplotlib中绘制两个图之间的线

    在许多情况下,来自其他答案的解决方案是次优的(因为只有在计算点之后没有对图进行任何更改时它们才有效). 更好的解决方案是使用专门设计的ConnectionPatch: import matplotli ...

  3. python怎么编写对称图案_python – 无论matplotlib中的箭头角度如何,都使箭头形状对称...

    以下代码生成下图.箭头的形状取决于箭头的角度.如何使所有箭头都具有相同的对称形状?我特别要求 Python 3,但欢迎一般的解决方案. import matplotlib.pyplot as plt ...

  4. python怎么弄成白色背景_python – 在matplotlib中为colorbar添加白色背景

    这是创建背景的解决方案: import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.axes_grid1.inset_l ...

  5. python怎么变各种颜色_python – 在matplotlib中变暗或变亮颜色

    这是一个来自 my gist的函数,用于减轻我认为可以使用matplotlib已知的任何颜色格式的任何颜色.我认为设定金额> 1也可能变暗. def lighten_color(color, a ...

  6. 更改matplotlib中x或y轴上的“刻度频率”?

    本文翻译自:Changing the "tick frequency" on x or y axis in matplotlib? I am trying to fix how p ...

  7. python绘图背景透明_如何在 Matplotlib 中更改绘图背景

    介绍Matplotlib是Python中使用最广泛的数据可视化库之一.无论是简单还是复杂的可视化项目,它都是大多数人的首选库.在本教程中,我们将研究如何在Matplotlib中更改绘图的背景.导入数据 ...

  8. python如何将三维图变成动态_python – 在matplotlib中制作动画三维散点图

    我试图在matplotlib中获得一个散点图的三维动画,基于here发布的2d散点图动画和here发布的3d线图. 问题来自set_data和set_offsets不能在3D中工作,所以你应该使用se ...

  9. python如何画动图_python之matplotlib画图教程(3)--如何画动图

    上一篇我们说好了,要给出整套源码,为了不占正文的篇幅,我会在文末贴出.放心,不是让你去关注公众号.因为,我并没有.. 之前我们聊了怎么画圆以及直线,我还是建议你能抽出10分钟把前面的文章先看了,因为这 ...

  10. python绘制折线图保存_Python利用matplotlib绘制折线图的新手教程

    前言 matplotlib是Python中的一个第三方库.主要用于开发2D图表,以渐进式.交互式的方式实现数据可视化,可以更直观的呈现数据,使数据更具说服力. 一.安装matplotlib pip i ...

最新文章

  1. 关于MySQLdb连接数据的使用(插入数据——使用前端页面的方式进行可视化)
  2. vue 方法里面修改样式_vue中修改swiper样式
  3. 2018湖湘杯web、misc记录
  4. Pytorch教程(十六):FashionMNIST数据集DataSet DataLoader
  5. c语言数据转移,重温C语言(2)之数据
  6. 各种排序(数据结构复习之内部排序算法总结)
  7. 基于android的百度地图_百度的71个炸天的开源项目
  8. 采用泰克示波器TBS2000和TCP0030A电流探头准确评估高速DCDC转换器电感的选择
  9. 【数据库】数据字典表
  10. 计算机的声卡怎么安装教程,图文详解如何安装声卡驱动_给电脑安装声卡驱动的详细教程...
  11. 游戏开发bug解决思路
  12. effective c++读书随记
  13. windows提升效率神器
  14. Python2.7爬虫——爬取微信公众号文章
  15. 开源数据库迁移工具canal
  16. win10网页找不到服务器dns,教你win10打开网页提示无法解析服务器dns地址的解决教程。...
  17. 几代数字无线通信系统标准汇总
  18. 阿里云IoT投入智物智造战略 三年赋能10亿设备改造10万家数字工厂
  19. Android模仿QQ的左右滑动切换界面和下拉更新的效果
  20. NVT SDK开关机LOGO替换实践

热门文章

  1. js中的cookie的读写操作示例详解
  2. 微信自定义分享,分享至QQ和空间自定义内容正常、分享至微信时只有链接问题
  3. 外显子bed文件获取
  4. itextpdf 提取数字签名签章图片
  5. QQ音乐爬虫(with scrapy)/QQ Music Spider
  6. 2022-2027年中国新能源汽车功率电子行业市场全景评估及发展战略规划报告
  7. 规模再创新高!新能源汽车蓝海谁主沉浮
  8. 给自己记录下申请免费域名的过程
  9. 动态IP和静态IP的区别如何使用动态IP
  10. java 汉字转拼音缩写_用JAVA实现汉字转拼音缩写