最近写论文,绘图时,由于图例遮挡了曲线图,十分影响阅读效果,开始尝试将图例的位置调整到曲线图的外部,借此文章记录调整方法。
我使用的是seaborn进行绘图,即在绘图之前需要引入seaborn包
import seaborn as sns
在存储数据时,我使用了dataframe,因此需要pandas包
import pandas as pd
我们先设定一个绘图的场景:一共有3个模型model1,model2, model3;设定一个参数α,可取值为两个α1和α2;指标(即纵轴)为每一个模型在每一个参数值下的性能(暂且记录为accuracy)。整理后的数据为:
Model | alpha | accuracy |
model1 | α1 | 0.81 |
model1 | α2 | 0.83 |
model2 | α1 | 0.76 |
model2 | α2 | 0.72 |
model3 | α1 | 0.78 |
model3 | α2 | 0.79 |
我们将这些数据存到dataframe中:
df = pd.DataFrame(columns = ['Model', 'Alpha', 'Accuracy'])
df = df.append({"Model": 'model1', "Alpha": 'alpha1', "Accuracy": 0.81}, ignore_index = True)
df = df.append({"Model": 'model1', "Alpha": 'alpha2', "Accuracy": 0.83}, ignore_index = True)
df = df.append({"Model": 'model2', "Alpha": 'alpha1', "Accuracy": 0.76}, ignore_index = True)
df = df.append({"Model": 'model2', "Alpha": 'alpha2', "Accuracy": 0.72}, ignore_index = True)
df = df.append({"Model": 'model3', "Alpha": 'alpha1', "Accuracy": 0.78}, ignore_index = True)
df = df.append({"Model": 'model3', "Alpha": 'alpha2', "Accuracy": 0.79}, ignore_index = True)
输出df,如下所示:
我们希望绘制一个柱状图,展示出每一个模型在不同参属下的accuracy,如果只进行简单的操作:
ax = sns.barplot(x = "Model", y = "Accuracy", hue = "Alpha", data = df)
绘制出来的是下面这个样子:
可以很明显看出图例遮挡了绘制图像的主体部分,会影响阅读
因此我们需要对上述代码进行补充:【重点在于补充的第二行】
ax = sns.barplot(x = "Model", y = "Accuracy", hue = "Alpha", data = df)
ax.legend(bbox_to_anchor=(0.75, -0.15), ncol=2)
然后就可以得到下面这样的图 :(图例已经到了下面,不再遮盖柱状图主体部分)
那么这几个参数是什么意思呢?
首先看一下ncol这个参数,这个参数是针对图例的,在上面这个小的测试实验中,图例有两个,ncol = 2就会让两个横向排列(即2列),如果设置ncol = 1,就会纵向排列,成为下面的样子:
然后再看bbox_to_anchor这个参数,也就是调整图例位置的关键参数,我们首先将该参数置零看一下效果:
ax = sns.barplot(x = "Model", y = "Accuracy", hue = "Alpha", data = df)
ax.legend(bbox_to_anchor=(0, 0), ncol=2)
可以看出,此时图例最右边的点,处于原点位置,此时如果改变bbox_to_anchor的值,就会相应向右,向上移动,如果想要移动到整个图的最下方中间位置(即向右,向下移动),我们就需要设置bbox_to_anchor = (0.75, -0.15)(当然,如果想要移动得到别的位置就可以自行调整)。