我想将生成的绘图图像保存到特定目录中,但是save_as
仅具有filename
自变量。
我正在使用以下代码保存图表
py.image.save_as(fig,filename='T_avg_'+lst_QoST_prop[i]+'.pdf')
是否可以指定目录?
答案 0 :(得分:5)
为了将文件保存在特定的文件路径中,您需要使用filename
参数。
import plotly.plotly as py
help(py.image)
| Helper functions wrapped around plotly's static image generation api. | | Class methods defined here: | save_as(figure_or_data, filename, format=None, width=None, height=None, scale=None) from builtins.type | Save a image of the plot described by `figure_or_data` locally as | `filename`. | | Valid image formats are 'png', 'svg', 'jpeg', and 'pdf'. | The format is taken as the extension of the filename or as the | supplied format. | | positional arguments: | - figure_or_data: The figure dict-like or data list-like object that | describes a plotly figure. | Same argument used in `py.plot`, `py.iplot`, | see https://plot.ly/python for examples | - filename: The filepath to save the image to | - format: 'png', 'svg', 'jpeg', 'pdf' | - width: output width | - height: output height | - scale: Increase the resolution of the image by `scale` amount | Only valid for PNG and JPEG images.
但是,这会导致HTML文件在的新标签页中打开 浏览器。图片已保存到“下载”文件夹中,而不是 可以指定保存图像的路径。
from plotly.offline import py
from plotly.graph_objs import Scatter
plot([Scatter(x=[14, 19, 24, 29, 34, 39, 89],
y=[30, 15, 18, 30, 24, 27, 50])], filename='2/billympoufo.html')
因此,您将在指定的文件夹中拥有html文件(下载文件夹中的图像),以便绕过浏览器行为,您可以:
(1) 从copyfile
导入shutil
并移动图像。
import os
import plotly
import plotly.graph_objs as go
import time
from shutil import copyfile
img_name = 'billympoufo'
dload = os.path.expanduser('~/Downloads')
save_dir = '/tmp'
data = [go.Scatter(x=[14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79, 84, 89, 1], y=[30, 15, 18, 30, 24, 27, 50, 36, 39, 42, 50, 48, 51, 54])]
plotly.offline.plot(data, image_filename=img_name, image='svg')
### might need to wait for plot to download before copying
time.sleep(1)
copyfile('{}/{}.svg'.format(dload, img_name),
'{}/{}.svg'.format(save_dir, img_name))
更多离线选项: (2) 检查铬或 (3) Firefox download behavior 。
通过使用参数auto_open=False
应该在不打开标签的情况下将图像保存在文件夹中 浏览器,但这是一个问题,请
在此处检查:Directly save image (without opening in browser) #880
,并没有计划 当时添加此功能。
您也可以 (4) 使用硒对页面进行截图
import os
import pandas as pd
import plotly
import plotly.graph_objs as go
import time
from selenium import webdriver
from PIL import Image
from pyvirtualdisplay import Display
### from bokeh/io, slightly modified to avoid their import_required util
### didn't ultimately use, but leaving in case I figure out how to stick wtih phentomjs
### - https://github.com/bokeh/bokeh/blob/master/bokeh/io/export.py
def create_default_webdriver():
'''Return phantomjs enabled webdriver'''
phantomjs_path = detect_phantomjs()
return webdriver.PhantomJS(executable_path=phantomjs_path, service_log_path=devnull)
### based on last SO answer above
### - https://stackoverflow.com/questions/38615811/how-to-download-a-file-with-python-selenium-and-phantomjs
def create_chromedriver_webdriver(dload_path):
display = Display(visible=0)
display.start()
chrome_options = webdriver.ChromeOptions()
prefs = {"download.default_directory": dload_path}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)
return driver, display
df = pd.DataFrame(
{'fruits': ['Apples', 'Pears', 'Nectarines', 'Plums', 'Grapes', 'Strawberries'],
'counts': [5, 3, 4, 2, 4, 6] })
data = [go.Bar(x=df['fruits'],y=df['counts'])]
dload = os.path.expanduser('~/Downloads')
html_file = 'plotly-fruit-plot.html'
fname = 'plotly-fruit-plot'
### original code contained height/width for the display and chromium webdriver
### I found they didn't matter; specifying the image size to generate will
### produce a plot of that size no matter the webdriver
plotly.offline.plot(data, filename=html_file, auto_open=False,
image_width=1280, image_height=800,image_filename=fname, image='png')
### create webdrive, open file, maximize, and sleep
driver, display = create_chromedriver_webdriver(dload)
driver.get('file:///{}'.format(os.path.abspath(html_file)))
# make sure we give the file time to download
time.sleep(1)
### was in the SO post and could be a more robust way to wait vs. just sleeping 1sec
# while not(glob.glob(os.path.join(dl_location, filename))):
# time.sleep(1)
driver.close()
display.stop()
image = Image.open('{}.png'.format(os.path.join(dload, fname)))
image
(来源:jupiter)
import plotly.plotly as py
import plotly.graph_objs as go
# sign in
data = [
go.Scatter(
x=[14, 19, 24, 29, 5, 10, 22],
y=[15, 18, 30, 24, 27, 30, 40]
)
]
plot_out = py.plot(data, filename='all_my_graphs/my_new_plot')
答案 1 :(得分:1)
如果我对您的理解正确,则希望使用python将图像保存在文件夹中。如果您进行搜索,该问题已经有答案。
我使用的功能是
savefig()
示例:
plot = dtf.plot()
fig = plot.get_figure()
fig.savefig("output.png") or fig.savefig("output.pdf") ...
此外,您还必须导入matplotlib库:
import matplotlib.pyplot as plt
答案 2 :(得分:1)
如果有任何疑问,我发现的最简单方法就是遵循文档https://plotly.com/python/static-image-export/
先安装>> pip install -U kaleido
import plotly.graph_objects as go
import os
fig = go.Figure()
fig.add_trace(go.Bar(x=["A"],
y=[25],
marker_color='rgb(55, 83, 109)',
name="A"
))
fig.add_trace(go.Bar(x=["B"],
y=[50],
marker_color='rgb(26, 118, 255)',
name="B"
))
fig.update_layout(
title='Test',
xaxis_tickfont_size=14,
yaxis=dict(
title='Time (ms)',
titlefont_size=16,
tickfont_size=14,
),
legend=dict(
x=1.0,
y=1.0,
bgcolor='rgba(255, 255, 255, 0)',
bordercolor='rgba(255, 255, 255, 0)'
),
barmode='group',
bargap=0.02,
bargroupgap=0.6,
width=500,
height=400
)
#fig.show()
if not os.path.exists("images"):
os.mkdir("images")
fig.write_image("images/fig1.pdf")