Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将%matplotlib笔记本后端的输出作为SVG包含在ipynb中_Python_Pandas_Matplotlib_Jupyter Notebook - Fatal编程技术网

Python 将%matplotlib笔记本后端的输出作为SVG包含在ipynb中

Python 将%matplotlib笔记本后端的输出作为SVG包含在ipynb中,python,pandas,matplotlib,jupyter-notebook,Python,Pandas,Matplotlib,Jupyter Notebook,几年前的答案展示了如何让jupyter笔记本创建图形作为svg。解决方案是告诉InlineBackend使用svg作为输出 import matplotlib.pyplot as plt %matplotlib inline %config InlineBackend.figure_format = 'svg' plt.plot(...) 这将导致笔记本内以及生成的ipynb文件中的所有图像均为svg格式;该文件将有一行,如 "data": { "image/svg+xml": [ "&l

几年前的答案展示了如何让jupyter笔记本创建图形作为svg。解决方案是告诉InlineBackend使用
svg
作为输出

import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
plt.plot(...)
这将导致笔记本内以及生成的ipynb文件中的所有图像均为svg格式;该文件将有一行,如

"data": {  "image/svg+xml": [  "<?xml  .....

因此,问题是:如何使ipynb文件包含使用
%matplotlib笔记本
后端作为SVG图像创建的绘图的静态版本?

有一个月前的一个小评论,他想做我现在想做的事,但没有答案或暗示

在我的代码中,我直接从数据框绘制:

%matplotlib notebook
import pandas as pd
df = pd.read_sql(sql1, connection)
...
...
df.plot(subplots=True, kind='bar')

无需导入
matplotlib.pyplot
就可以很好地工作,但也不能强制将图形创建为svg。我想,如果基本情况可行,我可以修改绘图代码,使其不涉及熊猫或数据帧。

从我阅读matplotlib后端的理解来看,nbagg(使用
%matplotlib笔记本称为nbagg)使用Agg(反颗粒几何体)渲染,它无法渲染矢量图形。不幸的是,这是为Jupyter使用交互式内联后端的唯一现成方法

文档链接
相似的答案

如果你不需要互动,就继续使用

import pandas as pd
from IPython.display import SVG, display
from numpy import ndarray

def svg_add(chart, size=(4,4), dpi=100):
    """Takes a chart, optional tuple of ints for size, int for dpi
    default is 4 by 4 inches with 100 dpi"""

    if type(chart) == ndarray:
        fig = chart[0].get_figure()
        fig.set_size_inches(size)
        fig.savefig("mybar.svg", dpi=dpi)
        display(SVG(filename='mybar.svg'))
    else:
        fig = chart.get_figure()
        fig.set_size_inches(size)
        fig.savefig("mybar.svg", dpi=dpi)
        display(SVG(filename='mybar.svg'))
然后


显然,即使在一段赏金期之后,也没有人能够提供解决方案,解决办法可能如下


  • 使用
    %matplotlib笔记本创建笔记本
    。一旦您对结果感到满意,请保存它

  • 使用它的副本并将
    %matplotlib笔记本
    替换为

    %matplotlib inline
    %config InlineBackend.figure_format = 'svg'
    
    重新运行完整的笔记本。保存结果


  • 在文本编辑器中打开生成的ipynb文件,并将前两行再次替换为
    %matplotlib notebook

  • 最终结果将是一个带有svg图像的ipynb。但一旦打开并运行,它将使用笔记本后端创建图形。

    如果进入jupyter笔记本,直接从pandas数据框中绘制一些内容,保存笔记本并关闭它,然后在文本编辑器中打开.ipynb文件,您将发现图形存储为.png像素级数据。你能不能把它存储为svg,这样它对某些类型的图形占用更少的空间。我花了一段时间才理解这个问题。因此,我对该问题进行了编辑,以使其更加清晰。请看一看,并决定这是否是你想问的问题(请注意,问题与熊猫的使用无关)。如果您对我的编辑不满意,请单击“我的编辑”并使用“回滚”按钮。是的,谢谢,添加了有关熊猫绘图的更多信息,但从您的编辑可以看出,您对这些图形格式的了解比我多一点,我只知道只有条线和几行线的绘图更紧凑。我一直在尝试其他绘图库,plotly似乎为交互式绘图提供了最佳效果。博克也很好。谢谢你的提示,我读到plotly是开源的,我不认为它是开源的,我可以看到它也有仪表盘。问题是如何让ipynb文件包含svg。
    %matplotlib笔记本
    后端在使用
    savefig
    时完全能够生成svg;但是需要的是一种将svg包含到ipynb文件中的方法。
    %matplotlib notebook
    使用
    Nbagg
    后端。它仅在笔记本中渲染时生成PNG文件。因此,当它在笔记本中呈现为PNG,然后保存笔记本时,您知道它只能呈现PNG,为什么希望它可以保存为在笔记本中呈现的SVG?Matplotlib接受自定义后端,也许您可以自己编写。现在的问题是可以做什么,而不是希望它做什么。我认为没有人希望笔记本后端将svg呈现到笔记本中。有人这么说吗?但是,由于可以生成svg,因此必须有一种方法将svg包含在ipynb文件中。这就是问题所要求的。我更愿意朝着
    $ipython nbconvert
    和一些模板的方向思考。无论如何,我看不出这个答案如何有助于实现这一目标。我理解你的意思,而且我很确定有一种黑客方法使用html
    magic
    或将笔记本的每个单元格的配置分离。例如,在一个单元格中使用
    %matplotlib notebook
    ,在另一个单元格中使用
    %matplotlib inline
    ,或者仅使用html并包含svg本身。但问题的框架是你希望它发生在
    %matplotlib笔记本上。如果您只是想显示svg,那么我更新了我的答案,显示正在保存svg,然后将其呈现到笔记本中感谢@fcsr是的,我注意到已保存的.svg是132kB,并没有我想象的那么小。这与您的
    subplot=False
    完美结合,尽管在我的用例中
    subplot=True
    导致了错误
    AttributeError:'numpy.ndarray'对象没有属性'get\u figure'
    我怀疑真正的答案是Pandas、Matplotlib或Jupyter开发者没有真正创建此功能(尚未)只有通过黑客才能真正做到这一点。感谢您设置了赏金,它还有20个小时。我们已经系统地测试了这一点,为每个步骤创建了一个新文件。步骤1、2和3之后的.ipynb文件大小分别为174kB、411kB和184kB。当我对文件内容进行文本搜索时,
    image/svg+xml
    仅在步骤之后的文件中2.添加了
    figsize=(10,30)
    btw,以便在第2步后设置大小。第3步,文本编辑器编辑并重新运行将其转换回png。该figsize命令确实取代了我对
    matplotlib笔记本
    的鼠标大小调整功能的需要,并存储svg。
    df = pd.DataFrame([[2,5]],columns=['a','b'])
    bar_chart = df.plot(subplots=False, kind='bar')
    svg_add(chart=bar_chart,size=(3,3),dpi=100)
    #or
    #svg_add(bar_chart,(3,3),100)
    
    %matplotlib inline
    %config InlineBackend.figure_format = 'svg'