我正在使用 Matplotlib 颜色图,而且我也碰巧正在使用 Spyder IDE,它有一个 ipython 控制台。
从屏幕截图中可以看到,ipython 控制台向我显示了颜色图对象的图形表示。 这是出乎意料的并且非常有帮助。
通常我希望看到对象的字符串表示形式,正如您可能从
print()
函数调用中看到的那样。 显示了对 print()
和 repr()
的函数调用,并且它们生成文本,这是更典型的。
我希望我自己的代码在生成输出时输出此图形表示。 我一直在探索
matplotlib.colors.Colormap
的内部结构,但到目前为止我还没有弄清楚如何实现。 ipython 在做什么? 我怎样才能做同样的事情?
谢谢!
IPython 查看对象是否有
_repr_html_
;如果是这样,它会调用它并将输出显示为 HTML。这是一个示例(我在 Jupyter 中运行了此示例,但只要您运行 IPython,它的工作原理就相同):
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()
要补充 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
希望这有帮助!
对于 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()