使用matplotlib缩放的\插入\轴时只有一个图例

2024-10-01 15:43:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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

错误。帮我把这些东西整理一下?你知道吗


Tags: alphalabelsnpaxhandlesmslimitpercent
1条回答
网友
1楼 · 发布于 2024-10-01 15:43:32
  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()

enter image description here

相关问题 更多 >

    热门问题