Matplotlib - маркировка точек (x, y) на линии со значением z - PullRequest
7 голосов
/ 30 января 2012

Я пытаюсь создать 2-мерный график, используя pyplot.Я читаю в файле с несколькими столбцами, каждый из которых содержит около 100 значений от 1 до 10. Я строю столбец 5 против столбца 6, что хорошо.

То, что я также хочу сделать, это пометить результирующую строку целочисленными значениями из столбца 0. Таким образом, строка будет иметь 11 точек в позициях (x, y), где столбец 0 является целым числом.Я также хотел бы, чтобы эти точки были помечены этим целым числом.

Я бы очень признателен за любую помощь с этим, это сводит меня с ума!

1 Ответ

26 голосов
/ 30 января 2012

Из твоего вопроса, я не на 100% точно понимаю, что ты хочешь делать.

Вы просто хотите пометить каждую вершину в линии? Или вы хотите пометить вершины, которые являются целыми числами? Или вы хотите интерполировать, где целые «пересечения» будут располагаться вдоль линии и обозначать их?

Прежде всего, для загрузки вашего текстового файла, посмотрите на numpy.loadtxt, если вы еще этого не сделали. В вашем конкретном случае вы можете сделать что-то вроде:

z, x, y = np.loadtxt('data.txt', usecols=[0, 5, 6]).T

В любом случае, в качестве краткого примера простейшего варианта (с маркировкой каждой вершины):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(10)
y = 2 * x
z = x ** 2

fig, ax = plt.subplots()
ax.plot(x, y, 'bo-')

for X, Y, Z in zip(x, y, z):
    # Annotate the points 5 _points_ above and to the left of the vertex
    ax.annotate('{}'.format(Z), xy=(X,Y), xytext=(-5, 5), ha='right',
                textcoords='offset points')

plt.show()

enter image description here

Теперь, для второго варианта, у нас может быть что-то похожее на это (аналогично тому, что предложил @ математический файл с кофе):

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-0.6, 5.6, 0.2)
y = 2 * x
z = x**2

fig, ax = plt.subplots()
ax.plot(x, y, 'bo-')

# Note the threshold... I'm assuming you want 1.000001 to be considered an int.
# Otherwise, you'd use "z % 1 == 0", but beware exact float comparisons!!
integers = z % 1 < 1e-6
for (X, Y, Z) in zip(x[integers], y[integers], z[integers]):
    ax.annotate('{:.0f}'.format(Z), xy=(X,Y), xytext=(-10, 10), ha='right',
                textcoords='offset points', 
                arrowprops=dict(arrowstyle='->', shrinkA=0))

plt.show()

enter image description here

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