当所有值均为正值时,面积图的绘图比例

时间:2018-07-23 22:41:53

标签: python pandas matplotlib

我正在尝试生成混合了arealine图表的图表。考虑我的数据帧df

df = pd.DataFrame([range(1, 4)] * 5, columns=list('ABC')).assign(B=lambda d: -d.B).cumsum()

还有我的图表

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

enter image description here

请注意,否定系列未显示。
现在,假设我将C系列的一个条目设为负值

df.loc[3, 'C'] = -1

然后再次绘图

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

enter image description here

这是我所期望的。但是,我确实有C系列的数据,都是一个符号。如何绘制它,以免其他系列的比例尺被破坏?


MCVE

# messed up
import pandas as pd

df = pd.DataFrame([range(1, 4)] * 5, columns=list('ABC')).assign(B=lambda d: -d.B).cumsum()

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

# correct but I have to put false data
import pandas as pd

df = pd.DataFrame([range(1, 4)] * 5, columns=list('ABC')).assign(B=lambda d: -d.B).cumsum()
df.loc[3, 'C'] = -1

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

2 个答案:

答案 0 :(得分:2)

我不知道,为什么会发生此错误。 *但是您可以强制执行autoscale。如果只想自动缩放一个轴,则可以指定它:

#not messed up anymore
import pandas as pd

df = pd.DataFrame([range(1, 4)] * 5, columns=list('ABC')).assign(B=lambda d: -d.B).cumsum()

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

plt.autoscale(True, axis = "y")
plt.show()

输出:
enter image description here

*正如@ImportanceOfBeingErnest在评论中指出的那样,这不是错误,而是面积图的理想行为,很不幸,它与此处的线图发生冲突。

答案 1 :(得分:1)

下面是一个示例,显示了如何显式设置限制:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame([range(1, 4)] * 5, columns=list('ABC')).assign(B=lambda d: -d.B).cumsum()

df.C.plot.area(stacked=False)
df.A.plot()
df.B.plot()

ymin, ymax = plt.ylim()

plt.ylim( [-ymax,ymax] )

plt.show()

在上面,我们检索了轴范围,然后将下限设置为与上限匹配。您可以用任何合适的方式对此进行详细说明。