Python: отображение списка кортежей
У меня есть следующий набор данных. Я хотел бы использовать python или gnuplot для построения данных. Кортежи имеют вид (x, y). Ось Y должна быть осью журнала. И.Е. войти (у). График рассеяния или график линии были бы идеальными.
Как это можно сделать?
[(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
(2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
(4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
Ответы
Ответ 1
Если я правильно задаю вопрос, вы можете сделать что-то вроде этого.
>>> import matplotlib.pyplot as plt
>>> testList =[(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
(2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
(4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
>>> from math import log
>>> testList2 = [(elem1, log(elem2)) for elem1, elem2 in testList]
>>> testList2
[(0, -16.617236475334405), (1, -17.67799605473062), (2, -18.691431541177973), (3, -18.9767093108359), (4, -19.420021520728017), (5, -19.298411635970396)]
>>> zip(*testList2)
[(0, 1, 2, 3, 4, 5), (-16.617236475334405, -17.67799605473062, -18.691431541177973, -18.9767093108359, -19.420021520728017, -19.298411635970396)]
>>> plt.scatter(*zip(*testList2))
>>> plt.show()
который даст вам что-то вроде
![enter image description here]()
Или как линейный график,
>>> plt.plot(*zip(*testList2))
>>> plt.show()
![enter image description here]()
EDIT. Если вы хотите добавить заголовок и метки для оси, вы можете сделать что-то вроде
>>> plt.scatter(*zip(*testList2))
>>> plt.title('Random Figure')
>>> plt.xlabel('X-Axis')
>>> plt.ylabel('Y-Axis')
>>> plt.show()
который даст вам
![enter image description here]()
Ответ 2
В matplotlib это будет:
import matplotlib.pyplot as plt
data = [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
(2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
(4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
x_val = [x[0] for x in data]
y_val = [x[1] for x in data]
print x_val
plt.plot(x_val,y_val)
plt.plot(x_val,y_val,'or')
plt.show()
который произведет:
![enter image description here]()
Ответ 3
Как ответили другие, scatter()
или plot()
будут генерировать нужный сюжет. Я предлагаю два уточнения ответов, которые уже здесь:
-
Используйте numpy для создания списка координат x и списка y-координат. Работа с большими наборами данных выполняется быстрее, чем использование итерации в Python, предложенной в других ответах.
-
Используйте pyplot для применения логарифмической шкалы, а не для непосредственного использования данных, если вы действительно не хотите иметь журналы.
import matplotlib.pyplot as plt
import numpy as np
data = [(2, 10), (3, 100), (4, 1000), (5, 100000)]
data_in_array = np.array(data)
'''
That looks like array([[ 2, 10],
[ 3, 100],
[ 4, 1000],
[ 5, 100000]])
'''
transposed = data_in_array.T
'''
That looks like array([[ 2, 3, 4, 5],
[ 10, 100, 1000, 100000]])
'''
x, y = transposed
# Here is the OO method
# You could also the state-based methods of pyplot
fig, ax = plt.subplots(1,1) # gets a handle for the AxesSubplot object
ax.plot(x, y, 'ro')
ax.plot(x, y, 'b-')
ax.set_yscale('log')
fig.show()
![result]()
Я также использовал ax.set_xlim(1, 6)
и ax.set_ylim(.1, 1e6)
, чтобы сделать его довольно.
Я использовал объектно-ориентированный интерфейс для matplotlib. Поскольку он обеспечивает большую гибкость и ясную ясность, используя имена созданных объектов, интерфейс OO предпочтительнее интерфейса интерактивного состояния.
Ответ 4
Вы также можете использовать zip
import matplotlib.pyplot as plt
l = [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08),
(2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09),
(4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]
x, y = zip(*l)
plt.plot(x, y)