当我用numpy数组创建一个简单的matpltlib图时,tick标签表现良好,智能地选择不重叠,间隔均匀地跨越数据范围。
然而,当我将数据导入到numpy数组中时,tick标签是一团乱麻。它似乎为 * 每个数据点 * 添加了一个刻度标签,而不是自动生成一个合理的刻度。
为什么我的数据导致它不是自动的?
如何让MPL自动为具有不规则间隔的X/Y数据的真实数据执行此操作?
“正常”行为:
import matplotlib.pyplot as plt
import numpy as np
import numpy.random as rnd
x = np.array( range(1000000) )
y = rnd.rand(1,1000000)[0]
fig, ax = plt.subplots()
ax.plot(x,y)
字符串
结果图,如预期:x1c 0d1x的数据
具有非等间距X轴数据的真实数据,从文件导入。
数据文件的片段:
-1900.209922,-106.022
-1900.176409,-103.902
-1900.142897,-112.337
-1900.109384,-109.252
...
型
绘图脚本:
import numpy as np
import matplotlib.pyplot as plt
import csv
# Read CSV file
with open(r"graph.csv", encoding='utf-8-sig') as fp:
reader = csv.reader(fp, delimiter=",", quotechar='"', )
data_read = [row for row in reader]
#end with file
d = np.array(data_read).T # transpose
x = d[0][0:10]
y = d[1][0:10]
fig, ax = plt.subplots()
ax.plot( x, y, "." )
fig.show()
型
我得到了凌乱的标签:
的
放大后,你可以看到它在我的数据点上添加了刻度:
的
如果我将X-data更改为线性数组,那么它会自动勾选x轴,将标签放在直观的位置(而不是数据点):
y = d[1][0:100]
x = range( len(y) ) # integer x-axis points
fig, ax = plt.subplots()
ax.plot( x, y, "." )
fig.show()
型
的
顺便说一句,即使我加载了20,000个数据点,使得y轴从-106 --88跨越(如果值间隔太近),y轴标签仍然冲突:
y[-1]
Out[31]: '-88.109'
y[0]
Out[32]: '-106.022'
型
x1c4d 1x的
最终,我将加载大量数据点(200,000),所以需要解决这个问题。
1条答案
按热度按时间wdebmtf21#
这是一个非常常见的问题,在打印字符串数据而不是数字数据时会出现此问题。从本质上讲,csv包是以字符串而不是数字的形式阅读数据。您可以通过遵循this answer来修复此问题,但您还有两个其他选项。
1.使用pandas.read_csv正确读入数据。它也有绘图方法。这是行程数值csv数据的建议方式。
1.将
d
转换为numpy浮点数组,如下所示。字符串
您可以使用
plt.savefig("filename.png")
来保存图形,而不是对它们进行截屏。