Matplotlib - перемещение текстовой метки вправо на точки 'x' - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть следующий код, который создает пузырьковую диаграмму, а затем добавляет метки в виде текста на график:

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)

enter image description here

Iиметь текстовые метки по центру по вертикали и горизонтали (то есть 1304,469 и т. д.), но в идеале я хочу, чтобы он был смещен вправо, чтобы он был далеко от пузыря.Я попробовал ha=right, но это лишь слегка подтолкнуло его.

Есть ли что-нибудь, что я могу использовать, чтобы полностью убрать это от пузыря?Т.е. код я могу поставить следующим for loop:

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

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

Я бы просто использовал процент смещения (например, 20%), чтобы изменить координату X текста.Дополнительно вы можете отключить ручную настройку x-limit.

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) 

enter image description here

0 голосов
/ 12 февраля 2019

Поскольку размер пузырьков s равен s=z*4000, радиус пузырька равен np.sqrt(z*4000)/2.(Объяснение см. размер маркера точечной диаграммы ).

Следовательно, вы должны создать аннотацию, которая будет располагаться в центре пузырьков в координатах данных и смещать ее на np.sqrt(z*4000)/2 в единицах.очков (или, возможно, на 2 или 3 балла больше, чтобы он выглядел красиво).

Это можно сделать, используя

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()

enter image description here

0 голосов
/ 12 февраля 2019

параметр xytext из ax.annotate давайте сделаем это:

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)

Приносит это:

enter image description here

Редактировать: если вы хотите, чтобы метки были справа от каждого круга, вам нужно будет создать массив позиций изатем цикл через него

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...