第二个Matplotlib图不保存到文件

时间:2016-12-20 15:48:46

标签: pandas matplotlib

我画的情节看起来如下:

enter image description here

它是使用以下代码创建的:

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

# 1. Plot a figure consisting of 3 separate axes
# ==============================================

plotNames = ['Plot1','Plot2','Plot3']

figure, axisList = plt.subplots(len(plotNames), sharex=True, sharey=True)

tempDF = pd.DataFrame()
tempDF['date'] = pd.date_range('2015-01-01','2015-12-31',freq='D')
tempDF['value'] = np.random.randn(tempDF['date'].size)
tempDF['value2'] = np.random.randn(tempDF['date'].size)

for i in range(len(plotNames)):
    axisList[i].plot_date(tempDF['date'],tempDF['value'],'b-',xdate=True)

# 2. Create a new single axis in the figure. This new axis sits over
# the top of the axes drawn previously. Make all the components of
# the new single axis invisibe except for the x and y labels.

big_ax = figure.add_subplot(111)
big_ax.set_axis_bgcolor('none')
big_ax.set_xlabel('Date',fontweight='bold')
big_ax.set_ylabel('Random normal',fontweight='bold')
big_ax.tick_params(labelcolor='none', top='off', bottom='off', left='off', right='off')
big_ax.spines['right'].set_visible(False)
big_ax.spines['top'].set_visible(False)
big_ax.spines['left'].set_visible(False)
big_ax.spines['bottom'].set_visible(False)

# 3. Plot a separate figure
# =========================
figure2,ax2 = plt.subplots()

ax2.plot_date(tempDF['date'],tempDF['value2'],'-',xdate=True,color='green')
ax2.set_xlabel('Date',fontweight='bold')
ax2.set_ylabel('Random normal',fontweight='bold')

# Save plot
# =========
plt.savefig('tempPlot.png',dpi=300)

基本上,绘制整个图片的理由如下:

  1. 创建第一个图并使用循环绘制3个单独的轴
  2. 在同一图中绘制单个轴,使其位于图形的顶部 先前画过。标记x和y轴。做其他所有方面 这个轴不可见。
  3. 创建第二个图并在单个轴上绘制数据。
  4. 当使用jupyter-notebook时,绘图显示正如我想要的那样,但是当保存绘图时,该文件仅包含第二个数字。

    我的印象是情节可能有多个数字,而且数字可能有多个轴。但是,我怀疑我对绘图,子图,数字和轴之间的差异存在根本性的误解。有人可以解释我做错了什么,并解释如何将整个图像保存到单个文件中。

1 个答案:

答案 0 :(得分:2)

Matplotlib没有“情节”。从这个意义上说,

  • 情节是数字
  • 子图是轴

在脚本运行期间,您可以拥有任意数量的数字。调用plt.save()将保存当前有效的数字,即通过调用plt.gcf()获得的数字 您可以通过提供图号num

来保存任何其他数字
plt.figure(num)
plt.savefig("output.png") 

或对图形对象fig1

进行反射
fig1.savefig("output.png") 

为了将多个数字保存到一个文件中,可以按照此处详述的方式进行:Python saving multiple figures into one PDF file。 另一种选择是不使用子图创建几个图,而是单个图,

fig = plt.figure()
ax = plt.add_subplot(611)
ax2 = plt.add_subplot(612)
ax3 = plt.add_subplot(613)
ax4 = plt.add_subplot(212)

然后使用

将相应的图形绘制到这些轴上
ax.plot(x,y)

或在pandas数据帧df

的情况下
df.plot(x="column1", y="column2", ax=ax)

第二个选项当然可以使用网格上的子图来推广到任意轴位置。这在matplotlib用户指南Customizing Location of Subplot Using GridSpec中有详细说明。 此外,可以使用fig.add_axes([left, bottom, width, height])在图中的任何位置定位轴(可以说是一个子图)(其中left, bottom, width, height在图形坐标中,范围从0到1)。