首页 > 解决方案 > Python/MatPlot 将图形对象保存到一个文件

问题描述

我有一个程序从 SQL 服务器读取数据,通过循环将其传递给对象类,创建 6 个图形作为对象,并将每个图形保存到一个文件中。我正在尝试将所有内容保存到同一个文件中(文件类型与 PDF、jpg 等无关)

#main
...
data = pd.dataframe(pd.read_sql("Select * from FOO", cnxn)
for i in range(1,7):
    graph = GraphObject(i, data)
    graph.func()

#GraphObject class
import matplotlib.pyplot as plt
import numpy as np
from datetime import date, timedelta

class GraphObject:
    i = -1
    data = ()

    def __init__(self,i,data):
        self.i = i
        self.data = data

    def func(self):
        canvassDateVar = date.today() - timedelta (days = self.i)
        filteredData = self.data[(self.data.CanvassDate == str(canvassDateVar))]

        cityAgeRange = list(filteredData["CityAgeRange"])
        signedUpPercent = list(filteredData["SignedUpPercent"])
        didNotSignUpPercent = list(filteredData["DidNotSignUpPercent"])
        tookSurvey = list(filteredData["TakeSurvey"])
        
        D = np.array(signedUpPercent)
        E = np.array(didNotSignUpPercent)
        F = np.array(tookSurvey)

        fig = plt.figure()
        pos = range(len(cityAgeRange))
        plt.xticks(pos, cityAgeRange, size = 'small')
        plt.xticks(rotation=45, ha='right')
        plt.ylabel('Percentages of Answers')
        plt.xlabel('City and Age Group')
        plt.title('Data Dive for ' + str(canvassDateVar), fontsize=14)
        plt.ylim([0, 200])

        plt.bar(pos, D)
        plt.bar(pos, E, bottom = D)

        plt.legend(['SignedUp', 'NotSignedUp'], loc = 0)

        ax2 = plt.twinx()
        ax2.plot(F, color = 'black')
        ax2.set_ylabel('Number of Surveys Taken')
        fileName = "Data " + str(canvassDateVar) + ".png"
        fig.savefig(fileName)

    def figure(self):
        plt.figure()

我已经尝试了我可以在 StackOverflow 上找到的所有解决方案,并通过搜索互联网(打印到 PDF、子绘图、创建数组然后从数组中保存等),但没有一个适用于这种特定场景。

标签: pythonnumpymatplotlib

解决方案


使用子图有什么问题?您可以将子图传递给构造函数,并在每次调用 func() 时写入它。如果您想避免这条路线,另一种选择是只导出到 HTML(不建议,MPLd3 并不总是完美地重新创建),或者您可以导出到 powerpoint,然后将幻灯片另存为图像。

我认为这两种选择都不是好主意。这听起来像是子图的完美用例。


推荐阅读