【问题标题】:Having just one legend when using matplotlib zoomed_inset_axes使用 matplotlib zoomed_inset_axes 时只有一个图例
【发布时间】:2018-08-17 17:23:27
【问题描述】:

我想用 4 组数据制作一个相当直截了当的图,其中两个在主图中,两个在插入图中(以不同的比例)。

这是起始代码::

w1snr_limit = np.arange(0, 50, 0.5)
w2snr_limit = np.arange(0, 50, 0.5)
w3snr_limit = np.arange(0, 10, 0.5)
w4snr_limit = np.arange(0, 10, 0.5)

w1snr_percent = w1snr_limit**(1/2.)
w2snr_percent = w2snr_limit**(1/2.)
w3snr_percent = w3snr_limit**(1/3.)
w4snr_percent = w4snr_limit**(1/4.)

fig, ax = plt.subplots(figsize=(8.0, 8.0))
xmin =   0.00 
xmax =  50.00
ymin =   0.00  
ymax = 100.00

ax.scatter(w1snr_limit, w1snr_percent, s=ms, alpha=0.85, label='W1 SNR')
ax.scatter(w2snr_limit, w2snr_percent, s=ms, alpha=0.85, label='W2 SNR')

ax.set_xlim((xmin, xmax))
ax.set_ylim((ymin, ymax))

然后会有这个插图::

axins = zoomed_inset_axes(ax, 2.0,  loc='lower right')
# sub region of the original image
x1, x2, y1, y2 = 0.0, 10., 0.0, 20.0
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
axins.scatter(w3snr_limit, w3snr_percent, s=ms, alpha=0.85, label='W3 SNR', color='green')
axins.scatter(w4snr_limit, w4snr_percent, s=ms, alpha=0.85, label='W4 SNR', color='red')

但是我首先很难正确放置插入图(即两个 x 轴都被咀嚼),而且我不清楚如何将所有 4 个数据集放入同一个图例中

handles, labels = ax.get_legend_handles_labels()

handles = [handles[0], handles[1], handles[2], handles[3]]
labels = [labels[0], labels[1], labels[2],labels[3]]

ax.legend(handles,labels,loc=2)

导致一个

IndexError: list index out of range

错误。只是为了整理这些东西没什么帮助?

【问题讨论】:

  • 好的,当然。但老实说,我不明白我如何可以使用更少的代码(最少)并且仍然清晰(完整)。
  • 由于未定义的变量,我无法运行代码,所以它不完整。 “最低限度”必须理解为“不超过必要”。
  • 更新了示例以定义变量。

标签: python matplotlib legend


【解决方案1】:
  1. 不确定“正确放置”是什么意思,但由于数据在图的下部,我建议将"upper right" 用作loc
  2. 您需要将axaxins 的句柄和标签都提供给图例,以便将它们全部包含在图例中。

完整示例:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes

w1snr_limit = w2snr_limit = np.arange(0, 50, 0.5)
w3snr_limit = w4snr_limit = np.arange(0, 10, 0.5)

w1snr_percent = w1snr_limit**(1/2.)
w2snr_percent = w2snr_limit**(1/2.)
w3snr_percent = w3snr_limit**(1/3.)
w4snr_percent = w4snr_limit**(1/4.)

fig, ax = plt.subplots(figsize=(8.0, 8.0))
xmin, xmax = 0., 50.
ymin, ymax = 0., 100. 

ax.scatter(w1snr_limit, w1snr_percent, s=6, alpha=0.85, label='W1 SNR')
ax.scatter(w2snr_limit, w2snr_percent, s=6, alpha=0.85, label='W2 SNR')

ax.set_xlim((xmin, xmax))
ax.set_ylim((ymin, ymax))

axins = zoomed_inset_axes(ax, 2.0,  loc='upper right')
# sub region of the original image
x1, x2, y1, y2 = 0.0, 10., 0.0, 20.0
axins.set_xlim(x1, x2)
axins.set_ylim(y1, y2)
axins.scatter(w3snr_limit, w3snr_percent, s=6, alpha=0.85, label='W3 SNR', color='green')
axins.scatter(w4snr_limit, w4snr_percent, s=6, alpha=0.85, label='W4 SNR', color='red')

handles, labels = ax.get_legend_handles_labels()
handles1, labels1 = axins.get_legend_handles_labels()

ax.legend(handles+handles1, labels+labels1, loc=2)

plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 2016-07-08
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2012-04-07
    相关资源
    最近更新 更多