Matplotlib pyplot.subplot:python和jupyter笔记本中的不同行为
在参加卡格尔比赛时,我遇到了一些奇怪的问题。 基本上,我正在尝试将am图像的矢量表示转换为png文件。它在iPython中运行良好,代码如下:Matplotlib pyplot.subplot:python和jupyter笔记本中的不同行为,matplotlib,Matplotlib,在参加卡格尔比赛时,我遇到了一些奇怪的问题。 基本上,我正在尝试将am图像的矢量表示转换为png文件。它在iPython中运行良好,代码如下: def drawing_to_np_prepare_data(drawing): drawing = eval(drawing) fig, ax = plt.subplots() plt.close(fig) print('[debug] ax=',ax) for x,y in drawing: a
def drawing_to_np_prepare_data(drawing):
drawing = eval(drawing)
fig, ax = plt.subplots()
plt.close(fig)
print('[debug] ax=',ax)
for x,y in drawing:
ax.plot(x, y, marker='.')
ax.axis('off')
fig.canvas.draw()
# Convert images to numpy array
np_drawing = np.array(fig.canvas.renderer._renderer)
print('[debug] fig_size=',fig.get_size_inches())
print('[debug] dpi=',fig.dpi)
print('[debug] shape=',np_drawing.shape)
print('[debug] size=',np_drawing.size)
print('[debug] shape=',np_drawing.shape)
im = cv2.cvtColor(np_drawing.astype(np.uint8), cv2.COLOR_BGR2RGB)
# compress
compressed_array = io.BytesIO()
np.savez_compressed(compressed_array, im)
compressed_array.seek(0)
print('[debug] size=',np_drawing.shape)
return compressed_array
结果表明:
[debug] ax=AxesSubplot(0.125,0.125;0.775x0.755)
[debug] fig_size= [6. 4.]
[debug] dpi= 72.0
[debug] np_drawing.size= 497664
[debug] shape= (288, 432, 4)
[debug] size= 1880
这满足了我的需要:我得到了一个压缩大小<2Kb的图像
但是,当我从CLI在python中运行此代码时,得到的结果却截然不同:
[debug] ax=AxesSubplot(0.125,0.11;0.775x0.77)
[debug] fig_size= [6.4 4.8]
[debug] dpi= 100.0
[debug] np_drawing.size= 1228800
[debug] shape= (480, 640, 4)
[debug] size= 13096
如您所见,图形大小、dpi、轴不同,因此,末端的大小也不同
我可以将参数传递给子地块:
plt.subplots(figsize=(6.,4.), dpi=72)
除了轴(和尺寸,我想是因为不同的轴):
注意:我已经检查了库版本,它们是相同的
因此,出现了多个问题:
我想知道到底发生了什么。谢谢 要在脚本中获得与笔记本中完全相同的设置,请打开笔记本,运行
%matplotlib inline
%config InlineBackend.rc
它将打印rcParams的字典
{'figure.figsize': (6.0, 4.0),
'figure.facecolor': (1, 1, 1, 0),
'figure.edgecolor': (1, 1, 1, 0),
'font.size': 10,
'figure.dpi': 72,
'figure.subplot.bottom': 0.125}
将它们复制到python文件中,如下所示:
newrc = {'figure.figsize': (6.0, 4.0),
'figure.facecolor': (1, 1, 1, 0),
'figure.edgecolor': (1, 1, 1, 0),
'font.size': 10,
'figure.dpi': 72,
'figure.subplot.bottom': 0.125}
import matplotlib.pyplot as plt
plt.rcParams.update(newrc)
然后做你的阴谋
无法测试这是否确实解决了不同渲染器大小的问题,因为问题不包含。若要在脚本中获得与笔记本中完全相同的设置,请打开笔记本,然后运行
%matplotlib inline
%config InlineBackend.rc
它将打印rcParams的字典
{'figure.figsize': (6.0, 4.0),
'figure.facecolor': (1, 1, 1, 0),
'figure.edgecolor': (1, 1, 1, 0),
'font.size': 10,
'figure.dpi': 72,
'figure.subplot.bottom': 0.125}
将它们复制到python文件中,如下所示:
newrc = {'figure.figsize': (6.0, 4.0),
'figure.facecolor': (1, 1, 1, 0),
'figure.edgecolor': (1, 1, 1, 0),
'font.size': 10,
'figure.dpi': 72,
'figure.subplot.bottom': 0.125}
import matplotlib.pyplot as plt
plt.rcParams.update(newrc)
然后做你的阴谋
无法测试这是否真的解决了不同渲染器大小的问题,因为问题不包含一个。酷,它起作用了。如何在python中运行以下命令:%matplotlib inline%config InlineBackend.rc?我想看看有什么区别。python不会更改rcParams,所以您可以直接打印它们,
print(plt.rcParams)
。很好,它成功了。如何在python中运行以下命令:%matplotlib inline%config InlineBackend.rc?我想看看有什么区别。python不会更改rcParams,所以您可以直接打印它们,print(plt.rcParams)
。