如何使用seaborn对象界面在标记的散点图点上绘制趋势线?

问题描述 投票:0回答:1

我正在使用

seaborn.objects
界面来标记绘图点。但是,如果存在标签,我无法添加趋势线。

在第一个示例中将参数

text='label'
和方法
.add(so.Line(color='orange'), so.PolyFit())
添加到
so.Plot()
不会同时渲染标签和趋势线。

  1. 有没有办法让两者都出现在同一个地块上?

  2. 此外,我怎样才能在这些图上绘制一条

    x=y
    线?

带有标记绘图点的绘图(工作):

import seaborn.objects as so
from matplotlib import pyplot as plt
import pandas as pd
import numpy as np

np.random.seed(42)
num_points = 10
df = pd.DataFrame({'x': np.random.randint(1, 100, size=num_points),
                   'y': np.random.randint(1, 100, size=num_points),
                   'label' : [chr(i + 65) for i in range(num_points)]})

fig, ax = plt.subplots()
p = so.Plot(data=df,
            x='x',
            y='y',
            text='label'
            ).add(so.Dot(marker='o')).add(so.Text(halign='left'))
p.on(ax).show()

enter image description here

趋势线图(工作):

fig, ax = plt.subplots()
p = so.Plot(data=df,
            x='x',
            y='y',
            ).add(so.Dot(marker='o')).add(so.Line(color='orange'), so.PolyFit())
p.on(ax).show()

enter image description here

但是,带有标记绘图点和趋势线代码的绘图仅显示前者:

fig, ax = plt.subplots()
p = so.Plot(data=df,
            x='x',
            y='y',
            text='label',
            ).add(so.Dot(marker='o')).add(so.Text(halign='left')).add(so.Line(color='orange'), so.PolyFit())
p.on(ax).show()

enter image description here

python seaborn scatter-plot trendline seaborn-objects
1个回答
2
投票

在您提供的示例中,在

text='label'
中设置
so.Plot
,这会导致文本标签映射到所有图层。由于某种原因,此全局映射会在 Line/PolyFit 层中被覆盖。我发现,如果您在
text='label'
层中设置
so.Text()
映射,则可以防止它被其他层删除。换句话说,只需对代码进行一点小小的更改即可进一步向下移动
text='label'

fig, ax = plt.subplots()
p = (
    so.Plot(data=df, x='x', y='y')
    .add(so.Dot(marker='o'))
    .add(so.Text(halign='left'), text='label') #set the text mapping here
    .add(so.Line(color='orange'), so.PolyFit())
)
p.on(ax).show()

Screenshot of result

关于在图中添加标识线的第二个问题,我不确定是否有办法使用

so
,但既然你使用的是
matplotib
,我将这样做:

fig, ax = plt.subplots()
p = (
    so.Plot(data=df, x='x', y='y')
    .add(so.Dot(marker='o'))
    .add(so.Text(halign='left'), text='label')
    .add(so.Line(color='orange'), so.PolyFit())
    .on(ax)
)
p_axes = p.plot()._figure.gca() #get the matplotlib handle of the p object
p_axes.plot(p_axes.get_xlim(), p_axes.get_xlim()) #plot identity line

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.