Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >指定matplotlib轴内容大小

指定matplotlib轴内容大小
EN

Stack Overflow用户
提问于 2019-04-15 14:45:19
回答 1查看 712关注 0票数 0

假设我正在尝试绘制一张具有x*y像素(或英寸)的黑洞图片。与其他许多人不同的是,我不想指定总的图形大小,而是指定绘图内容的大小(所以框架中的所有内容,除了框架本身、刻度、标签、色条、边距等)。

做这件事的首选方法是什么?

自己的尝试

我已经遇到这个问题好几次了,但我现在更喜欢其他方法,而不是以前的试错猜测迭代大小……这是我的“游乐场代码”:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np

%matplotlib inline
import matplotlib
from matplotlib import pyplot as plt
import notebook

print(matplotlib.__version__, notebook.__version__)
# 3.0.0, 5.7.0 in my case

# some data
x, y = 456, 123
a = np.random.randn(y, x)

# the following at least gets the actual figure size in browser right,
# but if possible i'd like to avoid large white space margins as well...
# %config InlineBackend.print_figure_kwargs = {'bbox_inches': None}

dpi = plt.rcParams['figure.dpi']
fig, ax = plt.subplots(figsize=(x/dpi, y/dpi), dpi=dpi)
im = ax.imshow(a, interpolation='none')
cb = fig.colorbar(im)

# print sizes
bbox = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
print(f"content size: ({bbox.width}, {bbox.height}) inch, ({bbox.width*fig.dpi}, {bbox.height*fig.dpi}) px")
print(f"fig size:     {fig.get_size_inches()} in, {fig.dpi*fig.get_size_inches()} px")
print(f"dpi: {fig.dpi}")

输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
content size: (4.023888888888889, 1.3870138888888888) inch, (289.72, 99.865) px
fig size:     [6.33333333 1.70833333] in, [456. 123.] px
dpi: 72.0

如你所见,打印的图片大小是456x123px,但如果你实际检查上传的图片(从浏览器粘贴的副本),你会发现它只有376x119px。虽然这是可以修复的(如代码中注释的那样),但独立于此的实际“内容”大小仍为282x75 px :-/。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 20:18:51

不幸的是,对于这一点没有首选的方法。脑海中浮现出一些或多或少复杂的变通方法。

A.使图形与图像一样大,在保存时将其展开

如果主要目的是生成图形的图像文件,最简单的方法可能是使图像绘图的轴与图形完全相同,然后通过bbox_inches="tight"选项展开最终的图像文件。

它将需要手动放置一个彩条以外的图形。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt

#create some image, with lines every second pixel
rows = 123
cols = 456
image = np.zeros((rows,cols))
image[:, np.arange(0,image.shape[1], 2)] = 1
image[np.arange(0,image.shape[0], 2), :] = 0.5

dpi = 100
fig, ax = plt.subplots(figsize=(image.shape[1]/dpi, image.shape[0]/dpi), dpi=dpi)
fig.subplots_adjust(0,0,1,1)

im = ax.imshow(image)

cax = fig.add_axes([1.05, 0, 0.03, 1])
fig.colorbar(im, cax=cax)

fig.savefig("test.png", bbox_inches="tight")

这样做的主要缺点是,它可能会导致一个像素错误的图像。这是由于位置始终在图形坐标中,导致在将轴大小标记为像素时出现舍入误差。

例如,如果在上面的代码中选择一个dpi=69,结果将是

交错的线条很容易发现图像的高度太小了一个像素。

B.使数字大于图像,调整页边距

上面的一个缺点是轴装饰和色条在图的外面。要将它们放在其中,可以定义所有边距并计算最终数字需要多大。这是一个但很麻烦的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt

#create some image
rows = 123
cols = 456
image = np.zeros((rows,cols))
image[:, np.arange(0,image.shape[1], 2)] = 1
image[np.arange(0,image.shape[0], 2), :] = 0.5

dpi = 100

left = right = 60
top = bottom = 40
cbarwidth = 24
wspace = 10

width = left + cols + wspace + cbarwidth + right
height = top + rows + bottom

w = width / dpi
h = height / dpi

fig, (ax, cax) = plt.subplots(ncols = 2, figsize=(w,h), dpi=dpi, 
                              gridspec_kw=dict(width_ratios=[cols, cbarwidth]))
fig.subplots_adjust(left = left/width, right = 1-right/width, 
                    bottom = bottom/height, top = 1-top/height, 
                    wspace = wspace / (cols + cbarwidth))

im = ax.imshow(image)
fig.colorbar(im, cax=cax)

fig.savefig("test2.png")

它也会遭受与A.相同的缺陷,例如,如果使用一些奇数,如

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
dpi = 72

left = right = 59
top = bottom = 37
cbarwidth = 19
wspace = 12

C.使用figimage并在顶部放置轴线。

确保没有锯齿效果的唯一方法是使用figimage。这会将像素坐标中的图像放入图中。但是,在默认情况下,将不会有任何轴。@anntzer提供了一个解决方案,即在图中figimage所在的位置放置一个轴。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox

#create some image, with lines every second pixel
rows = 123
cols = 456
image = np.zeros((rows,cols))
image[:, np.arange(0,image.shape[1], 2)] = 1
image[np.arange(0,image.shape[0], 2), :] = 0.5

dpi = 100

left = right = 60
top = 40
bottom = 65
cbarwidth = 24
wspace = 10

width = left + cols + wspace + cbarwidth + right
height = top + rows + bottom

w = width / dpi
h = height / dpi


fig = plt.figure(figsize=(w,h), dpi=dpi)

im = fig.figimage(image, xo=left, yo=bottom); 

# create axes on top
# bbox in pixels
bbox = Bbox([[left, bottom], [left + cols, bottom + rows]])
ax = fig.add_axes(fig.transFigure.inverted().transform_bbox(bbox))
ax.set_facecolor("None")
# recreate axis limits
ax.set(xlim=(-0.5, cols-0.5), ylim=(rows-0.5, -0.5))

# add colorbar
cbbox =  Bbox([[left + cols + wspace, bottom], 
               [left + cols + wspace + cbarwidth, bottom + rows]])
cax = fig.add_axes(fig.transFigure.inverted().transform_bbox(cbbox))
fig.colorbar(im, cax=cax)

fig.savefig("test3.png")

有了这个,就可以确定图像本身是没有失真的。但是,轴的刻度可能会偏离一个像素左右,因为它们会经过图形变换。此外,我还没有完全考虑bbox坐标是否需要移动半个单位。(欢迎对最后一点发表评论!)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55691721

复制
相关文章
Python+matplotlib可视化自定义轴域大小和位置
《Python可以这样学》,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷
Python小屋屋主
2020/06/03
6450
matplotlib的基本用法——调整坐标轴
本文主要是关于matplotlib的一些基本用法。 Demo import matplotlib.pyplot as plt import numpy as np # 绘制普通图像 x = np.linspace(-1, 1, 50) y1 = 2 * x + 1 y2 = x**2 plt.figure() plt.plot(x, y1) plt.plot(x, y2, color = 'red', linewidth = 1.0, linestyle = '--') # 设置坐标轴的取值范围 p
Tyan
2019/05/25
1.4K0
在matplotlib中关闭绘图轴的方法
# Keep making random walks, as long as the program is active
用户7718188
2021/10/08
2.2K0
使用 matplotlib 绘制带日期的坐标轴
使用 matplotlib 绘制带日期的坐标轴 源码及参考链接 效果图 [运行结果] 代码 import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates fig, ax = plt.subplots() """生成数据""" beginDate = '2012-01-01' endDate = '2018-01-01' # 将日期字符串转化为数字(从1970-01-01算起的天数差) x = n
iam002
2021/08/27
4.8K0
使用 matplotlib 绘制带日期的坐标轴
Matplotlib 可视化进阶之旋转浮动轴
旋转的浮动轴 难点:添加一个旋转的浮动轴。 本文利用matplotlib 的仿射变换来做实际的旋转,从而创建一个旋转的浮动轴。 这里需要了解戳👇。 Matplotlib 可视化之图表坐标系统 Matplotlib 图像可视化之 imshow 函数详解 首先定义一个画布 import numpy as np import matplotlib.pyplot as plt from matplotlib.transforms import Affine2D from matplotlib.ticker i
数据STUDIO
2022/05/24
7890
Matplotlib 可视化进阶之旋转浮动轴
Python+matplotlib数据可视化创建多轴域共享x轴
使用Python+matplotlib进行数据可视化,创建两个轴域并共享x轴,然后在两个轴域中分别绘制散点图和折线图,并为两个图形创建图例。
Python小屋屋主
2021/08/10
1.4K0
Matplotlib双Y轴折线图小实例
fig,ax1 = plt.subplots(figsize=(12,9))创建画布,有点类似于ggplot2的ggplot()函数的作用;figsize参数用来控制图片长和宽,但是单位是啥还没搞明白
用户7010445
2020/03/03
2.6K0
TencentOS手动指定根分区大小
TencentOS使腾讯云推出的一款Linux操作系统,采用基于社区5.4 LTS 深度优化的 tkernel4(简称 tk4)和基于社区4.14 LTS 深度优化的 tkernel3(简称 tk3)内核,具体内核版本需要参考操作系统的版本。
dumpcat
2022/08/11
1.5K0
Python使用matplotlib填充图形指定区域
本文代码重点在于演示Python扩展库matplotlib.pyplot中fill_between()函数的用法。 import numpy as np import matplotlib.pyplot as plt # 生成模拟数据 x = np.arange(0.0, 4.0*np.pi, 0.01) y = np.sin(x) # 绘制正弦曲线 plt.plot(x, y) # 绘制基准水平直线 plt.plot((x.min(),x.max()), (0,0)) # 设置坐标轴标签 plt.xla
Python小屋屋主
2018/04/16
3.1K0
Python使用matplotlib填充图形指定区域
Matplotlib 中文用户指南 5.1 指定颜色
在 matplotlib 的几乎所有地方,用户都可以指定颜色,它可以以如下形式提供:
ApacheCN_飞龙
2022/12/01
6550
Matplotlib 中文用户指南 5.1 指定颜色
Python生成指定大小的文件
在日常测试工作中,我们经常需要对上传的文件大小进行测试,例如:一个文件上传功能,限制文件大小最大为10MB,此时我们可能需要测试10MB以及其边界值9MB和11MB;再或者我们有时需要测试一个超大文件,进行大文件的测试。
测试蔡坨坨
2023/08/18
3380
Python生成指定大小的文件
Python-matplotlib双Y轴可视化绘制
最近有很多小伙伴私信我关于双Y轴图的绘制方法? 这里我就直接给出Python-matplotlib绘制方法和R-ggplot2的绘制方法,主要的知识点如下:
bugsuse
2021/01/04
2.1K0
Python-matplotlib双Y轴可视化绘制
数据可视化:Matplotlib的坐标轴管理
有兴趣的可以跟踪pyplot模块的figure函数,可以完整看见Figure的创建过程,由FigureManager创建与管理的。
马哥linux运维
2018/11/17
2.5K0
数据可视化:Matplotlib的坐标轴管理
python提取xml指定内容
1.第一种方法:python操作xml文件 随手找了一个xml文件内容(jenkins相关文件) <?xml version="1.0" encoding="UTF-8"?> <!-- The MIT
懿曲折扇情
2022/08/24
1.1K0
python提取xml指定内容
php遍历目录&删除指定文件中指定内容
现在正坐在安静的寝室里,寒假俨然已经离我而去了……今天发的是我寒假里搞的最后一次学习,之后的时间就一直在看海贼王了。
phith0n
2020/10/15
2.4K0
Linux如何生成指定大小的文件
可以直接分配一个指定容量的真实大小文件,且速度很快。 用法: fallocate -l 5G test.txt --创建一个大小为5G的真实文件(ls ,du都能看到5�G)
十毛
2022/10/25
8K0
Js 删除 指定Domin 指定 path 下的 cookie中指定的内容
假设,cookie中的key 为 keyName 则如果想删除客户端浏览器中某 Domin 某 Path 下的cookie内容的 keyName这一项,则可以操作如下(此时 Domin 为 xxx.com.cn,Path 为 /):
MickyInvQ
2020/09/27
3.9K0
点击加载更多

相似问题

Matplotlib:调整轴大小

11

用matplotlib指定X轴范围?

13

Matplotlib得到子图(轴)大小?

13

matplotlib颜色条更改轴大小

17

在matplotlib中指定图形的轴

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文