Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib-将文本标签向右移动';x';要点_Python_Matplotlib - Fatal编程技术网

Python Matplotlib-将文本标签向右移动';x';要点

Python Matplotlib-将文本标签向右移动';x';要点,python,matplotlib,Python,Matplotlib,我有以下代码生成气泡图,然后将标签作为文本添加到绘图中: fig, ax = plt.subplots(figsize = (5,10)) # create data x = [1,1,1,1,1,1,1,1,1,1] y = ['A','B','C','D', 'E','F','G','H','I',''] z = [10,20,80,210,390,1050,2180,4690,13040,0] labels = [1,2,8,21,39,105,218,469,1304]

我有以下代码生成气泡图,然后将标签作为文本添加到绘图中:

fig, ax = plt.subplots(figsize = (5,10))

# create data
x = [1,1,1,1,1,1,1,1,1,1]
y = ['A','B','C','D',
     'E','F','G','H','I','']
z = [10,20,80,210,390,1050,2180,4690,13040,0]

labels = [1,2,8,21,39,105,218,469,1304]

plt.xlim(0.9,1.1)

for i, txt in enumerate(labels):
    ax.annotate(txt, (x[i], y[i]), ha='center', va='center', )

plt.scatter(x, y, s=z*4000, c="#8C4799", alpha=0.3)

我有垂直和水平居中的文本标签(即1304469等),但理想情况下,我希望它向右移动,以便远离气泡。我试过
ha=right
,但它只是轻轻推了一下

有什么我可以用来把它完全从泡沫中移开的吗?例如,代码我可以将其放入以下循环

for i, txt in enumerate(labels):
    ax.annotate(txt, (x[i], y[i]), ha='center', va='center', )

ax.annotate
的参数
xytext
允许您执行以下操作:

fig, ax = plt.subplots(figsize = (5,10))

# create data
x = [1,1,1,1,1,1,1,1,1,1]
y = ['A','B','C','D',
     'E','F','G','H','I','']
z = [10,20,80,210,390,1050,2180,4690,13040,0]

labels = [1,2,8,21,39,105,218,469,1304]

plt.xlim(0.9,1.1)

for i, txt in enumerate(labels):
    ax.annotate(txt, (x[i], y[i]), ha='center', va='center', xytext=(1.05,y[i]) )

plt.scatter(x, y, s=z*4000, c="#8C4799", alpha=0.3)
这带来了:


编辑:如果希望标签恰好位于每个圆的右侧,则必须创建一个位置数组,然后在其中循环

我只需使用偏移百分比(例如20%)来重新定位文本的x坐标。此外,您还可以关闭x限制的手动设置

fig, ax = plt.subplots(figsize=(4, 10))

x = [1,1,1,1,1,1,1,1,1,1]
y = ['A','B','C','D',
     'E','F','G','H','I','']
z = [10,20,80,210,390,1050,2180,4690,13040,0]

labels = [1,2,8,21,39,105,218,469,1304]

for i, txt in enumerate(labels):
    ax.annotate(txt, (x[i]*1.2, y[i]), ha='center', va='center', )

plt.scatter(x, y, s=z*4000, c="#8C4799", alpha=0.3) 

由于气泡的大小
s
s=z*4000
,因此气泡的半径为
np.sqrt(z*4000)/2
。(有关解释,请参见)

因此,您将创建一个注释,该注释位于数据坐标中气泡的中心,并以点为单位(或可能多2或3个点以使其看起来美观)将其偏移
np.sqrt(z*4000)/2

这将通过使用

annotate("text", xy=(x[i],y[i]), 
         xytext=(np.sqrt(z[i]*4000)/2+2, 0),  textcoords="offset points")
完整示例:

import matplotlib.pyplot as plt
import numpy as np


fig, ax = plt.subplots(figsize = (5,10))

# create data
x = [1,1,1,1,1,1,1,1,1,1]
y = ['A','B','C','D',
     'E','F','G','H','I','']
z = [10,20,80,210,390,1050,2180,4690,13040,0]

labels = [1,2,8,21,39,105,218,469,1304]

plt.xlim(0.9,1.1)


sc = plt.scatter(x, y, s=z*4000, c="#8C4799", alpha=0.3)

for txt, size, xi, yi in zip(labels, sc.get_sizes(), x,y):
    ax.annotate(txt, xy=(xi,yi), xytext=(np.sqrt(size)/2+2, 0),
                textcoords="offset points",
                ha='left', va='center', )

plt.show()

ax.annotate(txt,(x[i]+1,y[i]),ha='center',va='center')
?嘿,谢谢。不幸的是,它对我不起作用,我知道它为什么不起作用,它偏离了我的情节。我已经竖起了你的大拇指,因为它可能会帮助某人:)。。。谢谢你嘿,谢谢你的帮助。我试过你的代码,它和我的代码是一样的。您有用于图表的代码吗?:)对不起,我不知道它为什么不见了。现在它完成了!非常感谢。工作完美。这真是一个好方法,谢谢!