在线图中用标记突出显示单个点

问题描述

我想使用标记在线图图上对一个点进行高光化处理。到目前为止,我设法创建了情节并将突出显示的地方插入我想要的地方。

问题是我有4个不同的线图(4个不同的分类属性),并且我将标记放置在每个sigle线图上,如下图所示:

Plot

我只想将标记放置在2020行(紫色标记)上。到目前为止,这是我的代码:

import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.ticker as plticker
import seaborn as sns
import numpy as np
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(15,10))
gs0 = gridspec.GridSpec(2,2,figure=fig,hspace=0.2)

ax1 = fig.add_subplot(gs0[0,:]) # lineplot
ax2 = fig.add_subplot(gs0[1,0]) #Used for another plot not shown here
ax3 = fig.add_subplot(gs0[1,1]) #Used for another plot not shown here

flatui = ["#636EFA","#EF553B","#00CC96","#AB63FA"]

sns.lineplot(ax=ax1,x="number of weeks",y="avg streams",hue="year",data=df,palette=flatui,marker = 'o',markersize=20,fillstyle='none',markeredgewidth=1.5,markeredgecolor='black',markevery=[5])

ax1.yaxis.set_major_formatter(ticker.FuncFormatter(lambda x,pos: '{:,.0f}'.format(x/1000) + 'K'))

ax1.set(title='Streams trend')
ax1.xaxis.set_major_locator(ticker.MultipleLocator(2))

我使用markevery字段将标记放在位置5。是否可以指定在哪一行/类别上放置我的标记?

编辑:这是我的数据框:

    avg streams date    year    number of weeks
0   145502.475  01-06   2017    0
1   158424.445  01-13   2017    1
2   166912.255  01-20   2017    2
3   169132.215  01-27   2017    3
4   181889.905  02-03   2017    4
... ... ... ... ...
181 760505.945  06-26   2020    25
182 713891.695  07-03   2020    26
183 700764.875  07-10   2020    27
184 753817.945  07-17   2020    28
185 717685.125  07-24   2020    29

186 rows × 4 columns

解决方法

markeveryLine2D属性。 sns.lineplot不返回行,因此您需要从the Axes中获取要注释的行。从lineplot调用中删除所有标记参数,然后添加...

lines = ax1.get_lines()

如果2020行/数据是系列中的第四条,

line = lines[3]
line.set_mark = 'o'
line.set_markersize = 20
line.set_markevery([5])
line.set_fillstyle('none')
line.set_markeredgewidth(1.5)
line.set_markeredgecolor('black')

# or
props = {'marker':'o','markersize':20,'fillstyle':'none','markeredgewidth':1.5,'markeredgecolor':'black','markevery': [5]}
line.set(**props)

受Quang Hoang的评论启发,另一种选择是添加一个圆,该圆围绕/在从DataFrame导出该点的点处。

x = 5    # your spec
wk = df['number of weeks']==5
yr = df['year']==2020
s = df[wk & yr]
y = s['avg streams'].to_numpy()
# or 
y = df.loc[(df['year']==2020) & (df['number of weeks']==5),'avg streams'].to_numpy()

ax1.plot(x,y,'ko',markersize=20,fillstyle='none',markeredgewidth=1.5)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...