x 轴意外反转 pandas.plot(...)
x-axis inverted unexpectedly by pandas.plot(...)
使用 pandas 绘制一系列数据与另一系列数据时,X 轴意外地自动反转。请看下面我的代码。如何确保 x 轴始终指向右侧? x 轴的这种自动反转是 pandas 的预期行为吗?可以禁用吗?
让我在下面解释一下我的例子。创建了三个地块。我希望每一个都显示向右上升的近 45 度线。然而,其中一些有 45 度线向右倾斜,因为它的 x 轴自动反转。似乎 x 轴是否反转取决于要绘制的值。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df2 = pd.DataFrame(np.random.randn(10, 3), columns=["a", "b", "c"])
df3 = df2*1.1
df3.rename(columns={"a": "a*1.1", "b": "b*1.1", "c": "c*1.1"}, inplace=True)
df23 = df2.join(df3)
fig, ax_list = plt.subplots(1,3)
ax=ax_list[0]
df23[["a", "a*1.1"]].plot(ax=ax, x="a")
ax.axis('equal')
ax.set_title("(x,y)=(a,a*1.1)")
print ax.get_xlim() ## Added for clarity
ax=ax_list[1]
df23[["b", "b*1.1"]].plot(ax=ax, x="b")
ax.axis('equal')
ax.set_title("(x,y)=(b,b*1.1)")
print ax.get_xlim() ## Added for clarity
ax=ax_list[2]
df23[["c", "c*1.1"]].plot(ax=ax, x="c")
ax.axis('equal')
ax.set_title("(x,y)=(c,c*1.1)")
print ax.get_xlim() ## Added for clarity
您可以为每个地块强制执行一个方向:
(t,b)= ax.get_xlim() ## Added for clarity
if t > b:
ax.set_xlim((b,t))
或
if ax.xaxis_inverted():
ax.invert_xaxis()
(不过后者只是显式的三行版本。)
我在 issue tracker of pandas 上问了这个问题,得到了答案。
daraframe.plot(..) 的设计使得
- 点的x坐标根据x参数指定的列的索引(即行号)确定
- 点的y坐标为y参数指定的列的值。
对于散点图,我觉得上面的设计不太合适。我能想到的唯一解决方案是直接使用 plt.plot。
也很有用。
使用 pandas 绘制一系列数据与另一系列数据时,X 轴意外地自动反转。请看下面我的代码。如何确保 x 轴始终指向右侧? x 轴的这种自动反转是 pandas 的预期行为吗?可以禁用吗?
让我在下面解释一下我的例子。创建了三个地块。我希望每一个都显示向右上升的近 45 度线。然而,其中一些有 45 度线向右倾斜,因为它的 x 轴自动反转。似乎 x 轴是否反转取决于要绘制的值。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df2 = pd.DataFrame(np.random.randn(10, 3), columns=["a", "b", "c"])
df3 = df2*1.1
df3.rename(columns={"a": "a*1.1", "b": "b*1.1", "c": "c*1.1"}, inplace=True)
df23 = df2.join(df3)
fig, ax_list = plt.subplots(1,3)
ax=ax_list[0]
df23[["a", "a*1.1"]].plot(ax=ax, x="a")
ax.axis('equal')
ax.set_title("(x,y)=(a,a*1.1)")
print ax.get_xlim() ## Added for clarity
ax=ax_list[1]
df23[["b", "b*1.1"]].plot(ax=ax, x="b")
ax.axis('equal')
ax.set_title("(x,y)=(b,b*1.1)")
print ax.get_xlim() ## Added for clarity
ax=ax_list[2]
df23[["c", "c*1.1"]].plot(ax=ax, x="c")
ax.axis('equal')
ax.set_title("(x,y)=(c,c*1.1)")
print ax.get_xlim() ## Added for clarity
您可以为每个地块强制执行一个方向:
(t,b)= ax.get_xlim() ## Added for clarity
if t > b:
ax.set_xlim((b,t))
或
if ax.xaxis_inverted():
ax.invert_xaxis()
(不过后者只是显式的三行版本。)
我在 issue tracker of pandas 上问了这个问题,得到了答案。
daraframe.plot(..) 的设计使得
- 点的x坐标根据x参数指定的列的索引(即行号)确定
- 点的y坐标为y参数指定的列的值。
对于散点图,我觉得上面的设计不太合适。我能想到的唯一解决方案是直接使用 plt.plot。