我正在使用
seaborn.objects
界面来标记绘图点。但是,如果存在标签,我无法添加趋势线。
在第一个示例中将参数
text='label'
和方法 .add(so.Line(color='orange'), so.PolyFit())
添加到 so.Plot()
不会同时渲染标签和趋势线。
有没有办法让两者都出现在同一个地块上?
此外,我怎样才能在这些图上绘制一条
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()
趋势线图(工作):
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()
但是,带有标记绘图点和趋势线代码的绘图仅显示前者:
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()
在您提供的示例中,在
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()
关于在图中添加标识线的第二个问题,我不确定是否有办法使用
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