为什么我的 pyplot.plot 数字没有正确保存?
Why aren't my pyplot.plot figures saved correctly?
我一直在使用 matplotlib 和 scipy 绘制频谱图和波形。频谱图(用 matplotlib.pyplot.pcolormesh()
绘制)正确保存,如我所示 here,使用此代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from matplotlib import cm
from scipy import signal
from scipy.io import wavfile
sample_rate, samples = wavfile.read('audio-mono.wav')
frequencies, times, spectrogram = signal.spectrogram(samples[:700000], sample_rate)
cMap = cm.get_cmap('gray', 3000)
new_colors = cMap(np.linspace(0.5, 1, 3000))
black = [0, 0, 0, 1]
new_colors[0, :] = black
new_cmp = ListedColormap(new_colors)
fig = plt.figure(figsize=(4,2), dpi=400, frameon=False)
plt.pcolormesh(times, frequencies, spectrogram, cmap=cMap)
plt.savefig('spectrogram.png')
但是,当我尝试绘制波形并保存图形时,我在绘图窗格中得到了绘图(我使用的是 Spyder),但图形保存为空白。如果我在 Spyder 的绘图窗格中单击对应于该图的保存按钮,我可以成功保存它并看到它,但我需要知道为什么我的代码无法正确保存它。这是:
import matplotlib.pyplot as plt
from scipy.io import wavfile
sample_rate, samples = wavfile.read('audio-mono.wav')
fig = plt.figure(figsize=(4,1), dpi=500, frameon=False)
ax = plt.Axes(fig, [2, 2, 2, 2])
ax.set_facecolor((0,0,0))
fig.add_axes(ax)
plt.tick_params(axis='both', which='both', bottom=False,
top=False, left=False, right=False,
labelbottom=False, labeltop=False,
labelright=False, labelleft=False)
plt.plot(samples)
plt.savefig('waveform.png')
提前致谢。
编辑 1
请注意,我将图形大小设置为 4x1(英寸)。保存的空白图形为 2000x500(像素),实际上与正确保存的频谱图大小完全相同。我假设这意味着我正在保存我用 plt.figure()
创建的图形,但不知何故轴没有出现在那里。
编辑 2
根据作为解决方案接受的答案,我发布了同一图的两个图形,其中不同的矩形传递给 Axes
实例。
首先,我最初使用上面发布的代码创建的图像(使用 IDE 的 'save' 按钮保存)。
其次,使用 Axes
对象保存的图形是用不同的矩形(解决方案中提出的)创建的。 ax = plt.Axes(fig, [0, 0, 1, 1])
正如已接受答案的评论中所说,我选择将此矩形传递给 Axes
对象的实例,因为它似乎能给我更好的分辨率。
您作为坐标轴位置传递的矩形不在图中。来自 documentation:
plt.axes(rect, projection=None, polar=False, **kwargs)
- 4-tuple of floats rect = [left, bottom, width, height]. A new axes is added with dimensions rect in normalized (0, 1) units using
add_axes
on the current figure.
因此,需要证明一个矩形,从图形坐标中的(0, 0)开始,到图形的边缘,即高和宽为1。
所以改变:
ax = plt.Axes(fig, [2, 2, 2, 2])
到
ax = plt.Axes(fig, [0, 0, 1, 1])
我一直在使用 matplotlib 和 scipy 绘制频谱图和波形。频谱图(用 matplotlib.pyplot.pcolormesh()
绘制)正确保存,如我所示 here,使用此代码:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from matplotlib import cm
from scipy import signal
from scipy.io import wavfile
sample_rate, samples = wavfile.read('audio-mono.wav')
frequencies, times, spectrogram = signal.spectrogram(samples[:700000], sample_rate)
cMap = cm.get_cmap('gray', 3000)
new_colors = cMap(np.linspace(0.5, 1, 3000))
black = [0, 0, 0, 1]
new_colors[0, :] = black
new_cmp = ListedColormap(new_colors)
fig = plt.figure(figsize=(4,2), dpi=400, frameon=False)
plt.pcolormesh(times, frequencies, spectrogram, cmap=cMap)
plt.savefig('spectrogram.png')
但是,当我尝试绘制波形并保存图形时,我在绘图窗格中得到了绘图(我使用的是 Spyder),但图形保存为空白。如果我在 Spyder 的绘图窗格中单击对应于该图的保存按钮,我可以成功保存它并看到它,但我需要知道为什么我的代码无法正确保存它。这是:
import matplotlib.pyplot as plt
from scipy.io import wavfile
sample_rate, samples = wavfile.read('audio-mono.wav')
fig = plt.figure(figsize=(4,1), dpi=500, frameon=False)
ax = plt.Axes(fig, [2, 2, 2, 2])
ax.set_facecolor((0,0,0))
fig.add_axes(ax)
plt.tick_params(axis='both', which='both', bottom=False,
top=False, left=False, right=False,
labelbottom=False, labeltop=False,
labelright=False, labelleft=False)
plt.plot(samples)
plt.savefig('waveform.png')
提前致谢。
编辑 1
请注意,我将图形大小设置为 4x1(英寸)。保存的空白图形为 2000x500(像素),实际上与正确保存的频谱图大小完全相同。我假设这意味着我正在保存我用 plt.figure()
创建的图形,但不知何故轴没有出现在那里。
编辑 2
根据作为解决方案接受的答案,我发布了同一图的两个图形,其中不同的矩形传递给 Axes
实例。
首先,我最初使用上面发布的代码创建的图像(使用 IDE 的 'save' 按钮保存)。
其次,使用 Axes
对象保存的图形是用不同的矩形(解决方案中提出的)创建的。 ax = plt.Axes(fig, [0, 0, 1, 1])
正如已接受答案的评论中所说,我选择将此矩形传递给 Axes
对象的实例,因为它似乎能给我更好的分辨率。
您作为坐标轴位置传递的矩形不在图中。来自 documentation:
plt.axes(rect, projection=None, polar=False, **kwargs)
- 4-tuple of floats rect = [left, bottom, width, height]. A new axes is added with dimensions rect in normalized (0, 1) units using
add_axes
on the current figure.
因此,需要证明一个矩形,从图形坐标中的(0, 0)开始,到图形的边缘,即高和宽为1。
所以改变:
ax = plt.Axes(fig, [2, 2, 2, 2])
到
ax = plt.Axes(fig, [0, 0, 1, 1])