有没有人知道如何将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。
答案 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)));