Как нанести точки на график с текстом в каждой точке (python) - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь повторить это: 1

У меня есть список слов, каждое из которых имеет координаты x и y. Мне нужно изобразить их так же, как показано выше. Как лучше всего это сделать? Я знаю, что могу сделать что-то вроде ...

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = [hello, xyz, bbb, fasjd, boy]

fig, ax = plt.subplots()

for i, txt in enumerate(n):
    ax.annotate(txt, (z[i], y[i]))

Но это не кажется слишком эффективным для того, что я хочу делать. Для каждого слова у меня есть функция, чтобы передать его, чтобы найти координату x, а затем другую функцию, чтобы найти его координату y. Может быть, просто список слов, а затем функция, которая просматривает и строит каждое из них по мере прохождения списка? Возможно ли такое?

def plotWords(words):

    fig, ax = pyplot.subplots()

    for w in words:

        ax.annotate(w, code for x coordinate, code for y coordinate)

    return ax

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Я думаю, вы можете использовать zip(), чтобы получить каждый из них в al oop.

import matplotlib.pyplot as plt

y = [2.56422, 3.77284, 3.52623, 3.51468, 3.02199]
z = [0.15, 0.3, 0.45, 0.6, 0.75]
n = ['hello', 'xyz', 'bbb', 'fasjd', 'boy']

fig = plt.figure(figsize=(4,3),dpi=144)
ax = fig.add_subplot(111)

def plotWords(words,z,y):
    for w,xx,yy in zip(words,z,y):
        ax.annotate(w, xy=(xx,yy))
    ax.set_ylim(0,5)
    plt.show()
    return 

plotWords(n,z,y)

введите описание изображения здесь

0 голосов
/ 05 августа 2020

Эта цифра

введите описание изображения здесь

было создано при выполнении этого скрипта

import matplotlib.pyplot as plt 
import numpy as np 

# determine the sequence of random numbers 
np.random.seed(sum(ord(c) for c in 'gboffi')) 

# initialize the plotting
fig, ax = plt.subplots(figsize=(8,6), constrained_layout=1) 

# a list of long words 
N = 40 
data = '/usr/share/dict/italian' 
long_words = [w.strip() for w in open(data) if len(w)>12 and "'" not in w] 
words = np.random.choice(long_words, N) 

# let's compute the word characteristics
xs = np.random.random(N) + [len(w) for w in words] 
ys = np.random.random(N) + [sum(ord(c) for c in w)/len(w) for w in words] 
# determine the axes limits
xmn = min(xs) ; xmx = max(xs) ; dx = xmx-xmn 
ymn = min(ys) ; ymx = max(ys) ; dy = ymx-ymn 
ax.set_xlim(xmn-0.05*dx, xmx+0.05*dx) ; ax.set_ylim(ymn-0.05*dy, ymx+0.05*dx) 
# label the axes
plt.xlabel('Word Length', size='x-large')
plt.ylabel('Mean Value', size='x-large')

# for every word, plot a red "o" and place the text around it 
for w, x, y in zip(words, xs, ys): 
    ax.plot((x,),(y,), 'o', c='r') 
    ax.annotate(w, (x, y), ha='center', va='center')

# the dashed red lines, the position is a little arbitrary
plt.hlines(ymn+0.5*dy, xmn, xmx, ls='--', color='r') 
plt.vlines(xmn+0.4*dx, ymn, ymx, ls='--', color='r')                                                                

# remove everything except points, red lines and axes' labels
plt.box(False)
plt.tick_params(left=0, top=0, right=0, bottom=0,
                labelleft=0, labeltop=0, labelright=0, labelbottom=0) 
# we are done
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...