<p>当我四处寻找相同问题的解决方案时,我发现了一个看起来更干净的方法(或者至少在精神上更接近最初的问题),即使用TextPath:</p>
<pre><code>from matplotlib import pyplot as plt
from matplotlib.text import TextPath
data = [["peach", 1.0, 1.0],
["apples", 19, 3.5],
["oranges", 7, 2.2],
["grapes", 23, 7.8]]
max_d2 = max([d[2] for d in data]) + 1e-3
max_d1 = max([d[1] for d in data]) + 1e-3
cmap = plt.get_cmap('RdBu')
for d in data:
path = TextPath((0,0), d[0])
# These dots are to display the weakness below, remove for the actual question
plt.plot(d[1],d[2],'.',color='k')
plt.plot(d[1],d[2],marker=path,markersize=100, color=cmap(d[2]/max_d2))
plt.xlim([0,max_d1+5])
plt.ylim([0,max_d2+0.5])
</code></pre>
<p><a href="https://i.stack.imgur.com/UanM6.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/UanM6.png" alt="Output image"/></a></p>
<p>这种解决方案本身有一些优点和缺点:</p>
<ul>
<li>主要缺点:正如圆点所显示的,我无法正确地将文本居中。相反,所需的值是图片的左下角。</li>
<li>主要优点:这没有乳胶问题,使用“真正的”标记路径,这意味着它可以很容易地用于标记线图(但不是最初的问题)</li>
</ul>
<p>代码:</p>
<pre><code>import numpy as np
x = np.cumsum(np.random.randn(100,5), axis=0)
plt.figure(figsize=(15,5))
for i in range(5):
label = TextPath((0,0), str(i), linewidth=1)
plt.plot(x[:,i], color='k')
plt.plot(np.arange(0,len(x),5),x[::5,i], color='k', marker=label, markersize=15, linewidth=0)
</code></pre>
<p><a href="https://i.stack.imgur.com/K1yul.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/K1yul.png" alt="Output for line plot"/></a></p>
<p>如果有很多行/标记,通过简单的“文本”或“注释”循环执行上述操作将非常缓慢,而这可以更好地扩展。</p>