matplotlib:分类变量的set_yticks和ylim

时间:2018-03-20 23:22:01

标签: python matplotlib

(Matplotlib 2.2.2版)

我正在绘制一些数据,其中y轴上的值是离散数据。 我想要做的是设置y轴的类别范围,以包括未出现在数据集中的值。 不幸的是,如果不在数据中,我没有找到添加其他类别的方法。

另外,我想设置一个特定的类别顺序,因为它们目前按照出现顺序排列。

这是我现有的MWE:

import matplotlib.pyplot as plt

fig = plt.figure()

ax1 = fig.add_subplot(211)
xs = list(range(10))
ys = ["on", "off", "off", "on","on", "off", "off", "on", "on", "off"]
ax1.plot(xs, ys)

ax2 = fig.add_subplot(212)
xs = list(range(10))
ys = ["on", "on", "on", "on","on", "on", "on", "on", "on", "on"]
ax2.plot(xs, ys)

fig.show()

它产生以下输出: MWE

我也希望展示" off"在底部图的y轴上。

当前的解决方案(不优雅,希望得到帮助):

到目前为止我的quickfix解决方案:我按照我想要的顺序添加一个带有类别名称的行和不在可见区域中的x坐标值(我可以轻松地使用x坐标来执行此操作'重新数字,因为我可以设置限制)。 然而,我希望有一个更优雅的解决方案(使用实际的API等)。 当x轴也是离散的时,这种解决方案也是不可能的,因为它不可能设置限制。

Quickfix源代码(如果有人可以使用它):

...
ax2 = fig.add_subplot(212)
xs = list(range(10))
ys = ["on", "on", "on", "on","on", "on", "on", "on", "on", "on"]
ax2.set_xlim([0,(len(xs)-1)])
ax2.plot(xs, ys)
categories_in_order = ["on", "error", "off", "extra"]
ax2.plot([-100] * len(categories_in_order), categories_in_order)
...

生成:enter image description here

1 个答案:

答案 0 :(得分:1)

仍然可以使用数值限制分类轴。基本上每个类别在轴上是整数0,1,2,...,N-1。你可以致电set_ylim

ax2.set_ylim(-.05, 1.05)

或者在这种情况下,仅复制其他轴的极限也是有意义的

ax2.set_ylim(ax.get_ylim())

更好的是,在子图之间共享y轴,例如在调用子图时使用sharey=True

您也可以将刻度设置为您想要的类别

ax2.set_yticks(["off", "on"])

我目前不知道如何为类别制作“占位符”。实际上,订单将由设置数据的顺序决定。但在这种情况下,一个简单的选择是反转轴,

ax2.invert_yaxis()

总计:

import matplotlib.pyplot as plt

fig, (ax1,ax2) = plt.subplots(nrows=2, sharey=True) #

xs = list(range(10))
ys = ["on", "off", "off", "on","on", "off", "off", "on", "on", "off"]
ax1.plot(xs, ys)

xs = list(range(10))
ys = ["on", "on", "on", "on","on", "on", "on", "on", "on", "on"]
ax2.plot(xs, ys)
ax2.set_yticks(["off", "on"])
ax2.invert_yaxis()


plt.show()

enter image description here