熊猫和Matplotlib绘图出现了奇怪的伪影问题。

3
什么导致了这个pandas系列的问题?
plt.plot(df["Column"].as_matrix())

good plot


plt.plot(df["Column"])

bad plot


df["Column"].plot()

实际上有类似的工件,但情节并不完全相同。

可能会有所帮助,如果您包含样本数据。我注意到两种方法之间的x轴范围发生了变化。我认为“pandas.Series”的索引可能导致不同的行为。 - Filip Kilibarda
1个回答

2
假设你有以下的数据框:
x = [2,1,3,6,5,6,7]
y = [1,2,5,1,1,6,1]
df = pd.DataFrame({"y" : y }, index=x)

调用`plt.plot(df["y"].as_matrix())`等同于`plt.plot(y)`,它只会绘制`y`值和其自身的索引(从0开始,每次增加1)。相反,`plt.plot(df["y"])`等同于`plt.plot(x,y)`,它会将`y`值绘制在数据框的索引上。如果这些索引没有排序,图形将会看起来扭曲。(对于pandas plot命令也是如此。)
以下是一个完整的例子。
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame({"y" : [1,2,5,1,1,6,1] }, index=[2,1,3,6,5,6,7])

plt.plot(df["y"].as_matrix(), lw=3, label='plt.plot(df["y"].as_matrix())')
plt.plot(df["y"], lw=3, label='plt.plot(df["y"])')
df["y"].plot(ax=plt.gca(), linestyle="--", color="k", label='df["y"].plot()')

plt.legend()
plt.show()

enter image description here

使用上述任何一种方法的最简单解决方案是重新索引数据帧。
df = df.reset_index()

这或多或少就是发生的事情。我一直在对我的数据进行子抽样并按另一列进行排序,这使得我的索引出了问题。我曾经认为系列上的“自然”索引会像数组索引一样,但显然不是这样。出于好奇,这种以这种方式进行索引的原因是什么,而不只是[0,series.size)...? - Him
1
原因当然是每个条目都应该有其定义的索引(否则就没有索引的必要)。这样可以在排序或过滤后明确地识别数据。您可以使用 df = df.reset_index() 来重新索引数据框。 - ImportanceOfBeingErnest
就像在关系型数据库中一样。 - Him

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接