Python - 将matplotlib图转换为熊猫数据帧

时间:2017-05-25 22:10:03

标签: python sql-server matplotlib reporting-services

有没有人知道如何将matplotlib图转换为熊猫数据框(作为PNG或JPG),而不必先将图形保存到文件中。此处的SQL Server 2017代码使用pandas和pickle输出varbinary(max)https://docs.microsoft.com/en-us/sql/advanced-analytics/tutorials/sqldev-py3-explore-and-visualize-the-data,但SSRS无法将其识别为有效的PNG(或JPG)图形。我们的目标是通过SQL中的sp_execute_external_script和varbinary(max)输出,以与我们对R图形相同的方式将Python图形导入SSRS。

2 个答案:

答案 0 :(得分:0)

问题的核心与pandas数据框本身无关 - 数据框只是这里的pickle对象的容器。

我猜你应该把这个数字保存到类似Python文件的对象,比如io.StringIO (Python 3)Stringio (python 2)

,而不是挑选图形。
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
import pandas as pd
import pickle

fig_handle = plt.figure()
plt.hist(InputDataSet.tipped)
plt.xlabel("Tipped")
plt.ylabel("Counts")
plt.title("Histogram, Tipped")

output_PNG = io.StringIO()
fig_handle.savefig(output_PNG)

OutputDataSet = output_PNG

如果PNG必须包含在pandas数据框中,也可以这样做,但我不知道这些数据是否有用......:

plot0 = pd.DataFrame(data =[output_PNG], columns =["plot"])
OutputDataSet = plot0

每当您将OutputDataSet作为varbinary(max)返回时,我的猜测是内容将完全是PNG文件。

很想知道这是否有效!

答案 1 :(得分:-1)

ALTER proc [dbo].[PythonBinary] as
exec sp_execute_external_script
@language = N'Python',
@script = N'
from io import BytesIO
import matplotlib.pyplot as plt
import numpy as np
t = np.arange(0.0, 2.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
fig, ax = plt.subplots()
ax.plot(t, s)
ax.set(xlabel=''time (s)'', ylabel=''voltage (mV)'', title=''test1'')
ax.grid()
plt.tight_layout()
graphic = BytesIO()
plt.savefig(graphic, format = "png")
df1 = pandas.DataFrame([["test1", graphic.getvalue()]])
ax.set(xlabel=''time (s)'', ylabel=''voltage (mV)'', title=''test2'')
plt.tight_layout()
graphic = BytesIO()
plt.savefig(graphic, format = "png")
df2 = pandas.DataFrame([["test2", graphic.getvalue()]])
OutputDataSet = OutputDataSet.append(df1)
OutputDataSet = OutputDataSet.append(df2)
'
with result sets (( "Graphic" varchar(max), "X" varbinary(max)));