python - Matplotlib 图例高度(以像素为单位)

标签 python matplotlib legend

我需要知道图例的大小(以像素为单位)。我似乎只能从任何函数中获得 height = 1....我尝试了以下方法

返回 1。

height = legend.get_frame().get_bbox_to_anchor().height

返回 [0,0],[1.,1.]

box = legend.get_window_extent().get_points()

这也返回 [0,0],[1.,1.]

box = legend.get_frame().get_bbox().get_points()

所有这些都返回 1,即使图例的大小发生变化!怎么回事?

最佳答案

这是因为您还没有绘制 Canvas 。

在绘制 Canvas 之前,像素值根本不存在于 matplotlib 中(或者更确切地说,它们存在,与屏幕或其他输出无关)。

这有很多原因,但我现在将跳过它们。可以这么说,matplotlib 尽量保持通用性,并且通常在绘制之前避免使用像素值。

举个简单的例子:

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), label='Test')
legend = ax.legend(loc='upper left')

print 'Height of legend before canvas is drawn:'
print legend.get_window_extent().height

fig.canvas.draw()

print 'Height of legend after canvas is drawn:'
print legend.get_window_extent().height

但是,这只会代表图例的高度(以像素为单位)在屏幕上绘制!如果您保存图形,它将以不同于屏幕上绘制的 dpi(默认情况下为 100)保存,因此以像素为单位的事物大小将不同。

有两种解决方法:

  1. 快速而肮脏:在输出像素值之前绘制图形的 Canvas ,并确保在保存时明确指定图形的 dpi(例如 fig.savefig('temp.png', dpi=fig. dpi).

  2. 推荐,但稍微复杂一些:将回调连接到绘制事件,并且仅在绘制图形时使用像素值。这使您可以在只绘制图形一次的情况下处理像素值。

作为后一种方法的快速示例:

import matplotlib.pyplot as plt

def on_draw(event):
    fig = event.canvas.figure
    ax = fig.axes[0] # I'm assuming only one subplot here!!
    legend = ax.legend_ 
    print legend.get_window_extent().height

fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), label='Test')
legend = ax.legend(loc='upper left')

fig.canvas.mpl_connect('draw_event', on_draw)

fig.savefig('temp.png')

请注意第一个和第二个示例中打印的图例高度不同。 (在我的系统上,第二个为 31.0,第一个为 24.8,但这将取决于 your .matplotlibrc file 中的默认值)

差异是由于默认 fig.dpi(默认 80 dpi)和保存图形时的默认分辨率(默认 100 dpi)之间的不同 dpi。

无论如何,希望这是有道理的。

关于python - Matplotlib 图例高度(以像素为单位),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5014609/

相关文章:

python - Matplotlib 完全覆盖补丁

python - Annotation auto-placement (matploylib.pyplot) - 或列表注释

python - 添加覆盖 twinx 轴线条的图例

python - 尝试在Docker容器中创建 session 时,Tensorflow卡住

python - 在cx_Freeze中编译后无法打开图像

python - 如何创建具有非数字 X 轴的条形图?

Python plotly legendgrouptitle_text 不作为 go.Scatter 参数

image - 向图像添加颜色图例

python - 使用 bash 文件运行两个 python 脚本

python - ChainMap.new_child() 返回什么?