我必须创建一个可视化,其中有多个线图(趋势线/移动平均线等)和多个散点图。
我已经成功地创建了一个单一的图中的所有图表,但我希望散点图的图例是从线图不同。
我希望线图的图例位于图的中心,散点图的图例位于图的左上角。
4个散点图的代码
#Scatter plot
#Using matplotlib scatter plot
scatter1 = plt.scatter(data=df[df.ABC < 10], x='Date', y='ABC', c = 'cyan' , s = 5, label='less')
scatter2 = plt.scatter(data=df[(df.ABC >= 10) & (df.ABC < 40)], x='Date', y='ABC', c = 'dodgerblue' , s = 5, label='normal')
scatter3 = plt.scatter(data=df[(df.ABC >= 40) & (df.ABC < 60)], x='Date', y='ABC', c = 'orangered' , s = 5, label='good')
scatter4 = plt.scatter(data=df[df.ABC > 60], x='Date', y='ABC', c = 'brown' , s = 5, label='more')
折线图和计算指标的代码(必须位于同一图例框中)
#Empty legend line specifying a calulated metric
plt.plot([], [], ' ', label=f'Points above Target Budget PR = {num}/{den} = {ans}%')
#plot using rolling average
#using seaborn.lineplot()
sns.lineplot( x = 'Date',
y = 'moving avg',
data = df,
color='red',
linewidth=1.5,
label = 'Moving Average')
#plot a simple time series plot
#using seaborn.lineplot()
sns.lineplot( x = 'Date',
y = 'Yield',
color = 'darkgreen',
linewidth = 1.5,
data = df,
label = 'Yield')
我尝试了以下方法来制作多个图例:
legend1 = plt.legend((scatter1,scatter2,scatter3,scatter4),['less','normal','good','more'], loc = 'upper left')
plt.gca().add_artist(legend1)
plt.legend(loc = 'center')
上面的代码所做的是,它在左上角为散点图创建一个图例。然而,相同的点被重写在图例中,该图例应该仅包含线图和计算的度量。因此散点图的图例在图表中表示两次。
我也试着在代码中做了其他的修改,但是结果总是导致1个图例包括全部,或者2个图例有散点图部分重复,或者根本没有图例。
3条答案
按热度按时间cl25kdpy1#
1.使用
pd.cut
将数据与类别绑定1.将滚动平均值和中位数作为列添加到数据框架中
1.使用
pandas.DataFrame.melt
将新列转换为长格式df
eiee3dmh2#
之前发布的优秀答案大多是针对OP问题的-我想添加一个通用的解决方案来解决这个问题,即使用每个艺术家类型的图例是在情节中存在的。
首先,我们需要一个函数从句柄中提取相同类型的艺术家
那么就很容易产生上面的情节……
cunj1qz13#
一种方法来做到这一点(我认为是更简单的方法)是简单地完成绘图,并得到所有6个条目的图例。然后使用
get_legend_handles_labels()
获取图例和句柄,根据需要将它们拆分,并将它们创建为单独的图例。注意add_artist是为了将第一个添加到轴上。整个代码在下面…主要是你所拥有的,删除了你所拥有的空图例行,大部分添加的代码都是朝着底部的...此外,Title 1和Title 2是可选的,您可以根据需要使用/删除它。