繁体   English   中英

如何在 Python 中列出 plot 元组列表?

[英]How do I plot list of tuples in Python?

我有以下数据集。 我想使用 Python 或 Gnuplot 到 plot 数据。 元组的形式为(x, y) Y 轴应该是对数轴,即log(y) 散点图 plot 或线 plot 将是理想的。

如何才能做到这一点?

 [(0, 6.0705199999997801e-08), (1, 2.1015700100300739e-08), 
 (2, 7.6280656623374823e-09), (3, 5.7348209304555086e-09), 
 (4, 3.6812203579604238e-09), (5, 4.1572516753310418e-09)]

如果我正确理解你的问题,你可以做这样的事情。

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

这会给你类似的东西

在此处输入图片说明

或者作为线图,

>>> plt.plot(*zip(*testList2))
>>> plt.show()

在此处输入图片说明

编辑- 如果要为轴添加标题和标签,可以执行以下操作

>>> plt.scatter(*zip(*testList2))
>>> plt.title('Random Figure')
>>> plt.xlabel('X-Axis')
>>> plt.ylabel('Y-Axis')
>>> plt.show()

这会给你

在此处输入图片说明

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

这将产生:

在此处输入图片说明

正如其他人所回答的那样, scatter()plot()将生成您想要的图。 我建议对已经在这里的答案进行两项改进:

  1. 使用 numpy 创建 x 坐标列表和 y 坐标列表。 在 numpy 中处理大型数据集比在其他答案中建议的 Python 中使用迭代更快。

  2. 使用 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()

结果

我还使用了ax.set_xlim(1, 6)ax.set_ylim(.1, 1e6)来使它漂亮。

我已经将面向对象的接口用于 matplotlib。 因为它通过使用创建的对象的名称提供了更大的灵活性和明确的清晰度,所以 OO 接口优于交互式基于状态的接口。

你也可以使用 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)

gnuplot使用gplot.py

from gplot import *

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

gplot.log('y')
gplot(*zip(*l))

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM