如何在 Python 中绘制元组列表?
Posted
技术标签:
【中文标题】如何在 Python 中绘制元组列表?【英文标题】:How do I plot list of tuples in Python? 【发布时间】:2013-08-29 19:19:11 【问题描述】:我有以下数据集。我想使用 Python 或 Gnuplot 来绘制数据。元组的形式为(x, y)
。 Y轴应该是对数轴,即log(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()
这会给你类似的东西
或者作为线图,
>>> plt.plot(*zip(*testList2))
>>> plt.show()
编辑 - 如果你想为轴添加标题和标签,你可以做类似的事情
>>> plt.scatter(*zip(*testList2))
>>> plt.title('Random Figure')
>>> plt.xlabel('X-Axis')
>>> plt.ylabel('Y-Axis')
>>> plt.show()
这会给你
【讨论】:
OP 询问不清楚是否希望 y 上的日志轴或希望 y 坐标为 log(y_data)。您可以使用plt.semilogy()
而不是plt.plot()
。
对于那些不知道的人,如果你愿意的话,* 会反转 zip -- 解压缩。【参考方案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()
会产生:
【讨论】:
OP 要求 y 轴为对数。使用plt.yscale('log')
进行 pyplot 交互模式。【参考方案3】:
正如其他人回答的那样,scatter()
或 plot()
将生成您想要的情节。我建议对已经存在的答案进行两项改进:
使用 numpy 创建 x 坐标列表和 y 坐标列表。在 numpy 中处理大型数据集比在 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()
我还使用了ax.set_xlim(1, 6)
和ax.set_ylim(.1, 1e6)
来使它更漂亮。
我在 matplotlib 中使用了面向对象的接口。因为它通过使用创建的对象的名称提供了更大的灵活性和明确性,所以 OO 接口优于基于交互式状态的接口。
【讨论】:
如果我想将每个 x 值的垂直线显示为一个非常窄的条(直到 y 值的高度),这样该图看起来就像一个离散且有色的 1-d直方图? Ash,matplotlib 有一个单独的方法可以将条形图添加到轴上,您可以调用它而不是plot
。将此作为问题发布,而不是对不相关问题的答案发表评论,除非我可能误解了您的问题与此相关的原因。【参考方案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)
【讨论】:
这不是与此答案前 4 年接受的答案中的解决方案完全相同吗?【参考方案5】:通过 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))
【讨论】:
以上是关于如何在 Python 中绘制元组列表?的主要内容,如果未能解决你的问题,请参考以下文章