我有下面的代码片段,可以通过图上的点集合绘制一条最佳拟合线,并使用相应的R2值对其进行注解:
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats
x = 50 * np.random.rand(20) + 50
y = 200 * np.random.rand(20)
plt.plot(x, y, 'o')
# k, n = np.polyfit(x, y, 1)
k, n, r, _, _ = scipy.stats.linregress(x, y)
line = plt.axline((0, n), slope=k, color='blue')
xy = line.get_xydata()
plt.annotate(
f'$R^2={r**2:.3f}$',
(xy[0] + xy[-1]) // 2,
xycoords='axes fraction',
ha='center', va='center_baseline',
rotation=k, rotation_mode='anchor',
)
plt.show()
字符串
我已经尝试了各种不同的(x,y)
对,不同的xycoords
和annotate
中的其他关键字参数,但我无法让注解正确地出现在我想要的地方。如何让文本注解正确地旋转出现在行的上方,位于行的中点或两端?
1条答案
按热度按时间dfuffjeb1#
1.标注坐标
我们不能在这里使用
xydata
计算坐标,因为axline()
只是返回dummyxydata
(可能是由于matplotlib内部绘制无限直线的方式):字符串
相反,我们可以根据
xlim()
计算文本坐标:型
请注意,这些是数据坐标,因此它们应该与
xycoords='data'
一起使用,而不是'axes fraction'
。2.标注Angular
我们不能纯粹从线点计算Angular ,因为Angular 还取决于轴限制和图形尺寸(例如,想象6x4图形与2x8图形中所需的旋转Angular )。
相反,我们应该normalize the calculation to both scales来获得正确的视觉旋转:
的数据
型