使用什么魔法在 ipython 控制台中显示 Matplotlib 颜色图?

问题描述 投票:0回答:4

我正在使用 Matplotlib 颜色图,而且我也碰巧正在使用 Spyder IDE,它有一个 ipython 控制台。

Screen shot of ipython console in Spyder showing Matplotlib color map rendering as a graph

从屏幕截图中可以看到,ipython 控制台向我显示了颜色图对象的图形表示。 这是出乎意料的并且非常有帮助。

通常我希望看到对象的字符串表示形式,正如您可能从

print()
函数调用中看到的那样。 显示了对
print()
repr()
的函数调用,并且它们生成文本,这是更典型的。

我希望我自己的代码在生成输出时输出此图形表示。 我一直在探索

matplotlib.colors.Colormap
的内部结构,但到目前为止我还没有弄清楚如何实现。 ipython 在做什么? 我怎样才能做同样的事情?

谢谢!

matplotlib ipython spyder
4个回答
0
投票

这看起来像是 ipython/jupyter 的功能。 ipython 检测对象并自动生成一个绘图来预览颜色图。

这里使用jupyter:

cmap preview


0
投票

IPython 查看对象是否有

_repr_html_
;如果是这样,它会调用它并将输出显示为 HTML。这是一个示例(我在 Jupyter 中运行了此示例,但只要您运行 IPython,它的工作原理就相同):

enter image description here

class MyCoolObject:
    def _repr_html_(self):
        return ("<h1>hello!</h1> <p>this is some html </p>"
                "I can even put images:"
                "<img src='https://upload.wikimedia.org/wikipedia"
                "/commons/thumb/3/38/Jupyter_logo.svg"
                "/44px-Jupyter_logo.svg.png'></img>")

MyCoolObject()

0
投票

要补充 Eduardo 的答案,从我读过的所有内容来看,添加

_repr_html_
方法应该使 iPython 在您将对象键入控制台时显示该对象。我也使用spyder,但无法让它按我预期的方式工作。这个简单的包装类应该允许你显示任何html:

class displayedHTML:
    def __init__(self, html):
        self.html = html

    def _repr_html_(self):
        return self.html

但正如你所看到的,它对我不起作用,而是显示该类的(隐式定义的)

__repr__

In [2]: obj = displayedHTML("<h1>" + "hello world" + "</h1>")

In [3]: obj
Out[3]: <__main__.displayedHTML at 0x1e8cda8f0d0>

我无法找到这不起作用的原因,但如果您只想在控制台中显示 matplotlib 颜色图从代码(就像我所做的那样),我找到了一种解决方法。

既然知道 matplotlib 对象可以正常工作,我们就可以将它交给 ipython 显示函数:

from IPython.display import display #Included without import since IPython 5.4 and 6.1
viridis = matplotlib.cm.get_cmap('viridis')
display(viridis)

对我来说这很有效...... not_allowed_to_insert_pictures_yet.jpg

希望这有帮助!


0
投票

对于 ipython,您需要定义

_repr_png_

"""Custom ipython color example."""

from io import BytesIO

import matplotlib.colors as colors
import numpy as np
from PIL import Image
from PIL.PngImagePlugin import PngInfo

class MyColors:
    """Custom color class with fancy ipython options."""
    def __init__(self, color: str = ""):
        if color == "r":
            self.colors = ("xkcd:brick", "xkcd:red", "xkcd:bright red")
        elif color == "g":
            self.colors = ("xkcd:dark green", "xkcd:green", "xkcd:easter green", "xkcd:lightgreen")
        elif color == "b":
            self.colors = ("xkcd:navy blue", "xkcd:royal blue", "xkcd:blue", "xkcd:azure", "xkcd:cyan")
        else:
            self.colors = ("xkcd:white", "xkcd:light grey", "xkcd:grey", "xkcd:medium grey", "xkcd:slate", "xkcd:black")

    @property
    def N(self) -> int:
        """Number of colors."""
        return len(self.colors)

    def get_color(self, ix: int) -> tuple[float, float, float, float]:
        """Get the RGBA values for color `ix` in colormap."""
        return colors.to_rgba(self.colors[ix])

    def _repr_png_(self):
        """Generate a PNG representation of the Colormap."""
        pixels = np.zeros((64, 512, 4), dtype=np.uint8)
        cuts = np.round(np.linspace(0, 512, self.N + 1)).astype(int)
        for i in range(self.N):
            pixels[:, cuts[i]:cuts[i+1], :] = 255*np.asanyarray(self.get_color(i))
        png_bytes = BytesIO()
        title = "MyColors"
        author = "Author Name"
        pnginfo = PngInfo()
        pnginfo.add_text("Title", title)
        pnginfo.add_text("Description", title)
        pnginfo.add_text("Author", author)
        pnginfo.add_text("Software", author)
        Image.fromarray(pixels).save(png_bytes, format="png", pnginfo=pnginfo)
        return png_bytes.getvalue()

我的图片粘贴不起作用,但请尝试一下

In [1]: MyColors("r")

In [2]: MyColors("g")

In [3]: MyColors("b")

In [4]: MyColors()

© www.soinside.com 2019 - 2024. All rights reserved.