【问题标题】:ipython shell and displaying chartsipython shell 和显示图表
【发布时间】:2026-01-15 22:40:01
【问题描述】:

我正在使用这段代码,我在另一个窗口中打开了一个可视化/图表,在 ipython shell 中没有任何问题:

In [1]: import numpy as np                                                                                                                            

In [2]: import matplotlib.pyplot as plt                                                                                                               

In [3]: matplotlib                                                                                                                                    
Using matplotlib backend: Qt5Agg

In [4]: x = np.linspace(0, 3*np.pi, 500)                                                                                                              

In [5]: plt.plot(x, np.sin(x**2))                                                                                                                     
Out[5]: [<matplotlib.lines.Line2D at 0x7fb6d69ab470>]

In [6]:  

检查此Screenshot。如果我使用 matplotlib 以外的任何库,那么我不会得到任何可视化/图表。我确实在笔记本中得到它,但在 ipython shell 中没有。难道我做错了什么 ?

In [7]: poly = Polygon([(0,0), (0,5), (5,5), (5,0)])                                                                                                  

In [8]: print(poly)                                                                                                                                   
POLYGON ((0 0, 0 5, 5 5, 5 0, 0 0))

In [9]: print('area', poly.area)                                                                                                                      
area 25.0

In [10]: display(poly)                                                                                                                                
<shapely.geometry.polygon.Polygon at 0x7fc2a3f9d5c0>

In [11]:                                                                                                                                              

【问题讨论】:

  • 据我了解,shapely 没有绘图功能。将 matplotlib 与笛卡尔一起用于形状绘图。这里有一个要点:gist.github.com/sweenzor/8275135,更多关于笛卡尔的信息在这里:pypi.org/project/descartes
  • 如果是这样的话,它怎么能在 Notebook 上运行呢?
  • 这是一个不同的问题,下面给出了精彩的回答。但是,我的评论应该指向您如何在 IPython 中绘制匀称的对象。 (或 Spyder,或 Python...)

标签: python matplotlib jupyter-notebook ipython shapely


【解决方案1】:

matplotlib GUI 窗口是通过 Qt5Agg 后端创建的。这实际上创建了一个 PyQt 窗口,在其中放置了一个导航工具栏和一个画布,并将图形渲染到这个画布上。这是一段相当复杂的代码。

其他库,例如匀称,不一定有这样的后端。但当然,您可以通过笛卡尔将匀称的对象转换为 matplotlib 补丁,然后以与任何其他 matplotlib 图相同的方式显示带有匀称形状的 matplotlib 图。

那么,为什么您可以直接在 jupyter notebook 中显示形状匀称的对象

from shapely.geometry import Polygon, LineString
poly = Polygon([(0,0), (0,5), (5,5), (5,0)])
line = LineString([(0,0), (0,5), (5,0), (5,5)])

display(poly)
display(line)

原因是笔记本是在浏览器中呈现的。浏览器理解标记语言,如 html 和 svg。因此,创建对象的 svg 表示相对容易。这就是shapely does。大多数身材匀称的对象都有一个._repr_svg_() 方法。如果你打印它的输出,它将是一个 svg 字符串

print(poly._repr_svg_())

结果

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100.0" height="100.0" viewBox="-0.2 -0.2 5.4 5.4" preserveAspectRatio="xMinYMin meet">  
   <g transform="matrix(1,0,0,-1,0,5.0)">
      <path fill-rule="evenodd" fill="#66cc99" stroke="#555555" stroke-width="0.10800000000000001" opacity="0.6" d="M 0.0,0.0 L 0.0,5.0 L 5.0,5.0 L 5.0,0.0 L 0.0,0.0 z" />
   </g>
</svg>

此字符串由浏览器解释并显示相应的图像。

python 控制台没有任何选项可以在内部显示 svg 图像。因此,这只适用于 jupyter 或 IPython Qtconsole,但不适用于标准 IPython。

【讨论】:

  • 哇.. 我今年收到的关于任何事情的最佳答案/回复。直接进入头部:)
【解决方案2】:

这似乎有效

from shapely.geometry import Polygon
import matplotlib.pyplot as plt
poly = Polygon([(0,0), (0,5), (5,5), (5,0)])    
x, y = poly.exterior.xy
fig, ax = plt.subplots()
ax.scatter(x, y)
fig.show()

编辑:澄清 shapely 没有绘图功能,旨在与 matplotlib 一起使用。此外,显示功能仅适用于图像数据 IIRC,您提供的对象并非如此。

【讨论】:

    最近更新 更多