使用matplotlib的多种颜色的彩色轴脊柱

时间:2017-05-30 23:19:52

标签: python matplotlib charts

使用python中的matplotlib可以用多种颜色对轴脊进行着色吗?

所需的输出样式

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以使用LineCollection创建multicolored line。然后,您可以使用xaxis-transform将其固定为xaxis,与y-limits无关。将实际脊椎设置为不可见并关闭clip_on会使LineCollection看起来像轴脊柱。

import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
import numpy as np

fig, ax = plt.subplots()

colors=["b","r","lightgreen","gold"]
x=[0,.25,.5,.75,1]
y=[0,0,0,0,0]
points = np.array([x, y]).T.reshape(-1, 1, 2)
segments = np.concatenate([points[:-1], points[1:]], axis=1)
lc = LineCollection(segments,colors=colors, linewidth=2,
                               transform=ax.get_xaxis_transform(), clip_on=False )
ax.add_collection(lc)
ax.spines["bottom"].set_visible(False)
ax.set_xticks(x)
plt.show()

enter image description here

答案 1 :(得分:0)

这是一个略有不同的解决方案。如果您不想为整个轴重新着色,则可以使用zorder来确保在原始轴的顶部可见彩色的线段。

绘制主图后:

  • 保存x和y限制
  • 在ylims [0]上绘制具有所需颜色的所选x值之间的水平线
  • 应关闭剪辑,以使线条在严格的绘图区域外可见
  • zorder应该足够高,可以将新行放置在轴的前面
  • 保存的x和y限制需要放回去,因为绘制多余的线会移动它们(或者,您可能已经在绘制彩色轴之前通过调用plt.autoscale(False)关闭了自动缩放轴限制)
from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 20, 100)
for i in range(10):
    plt.plot(x, np.sin(x*(1-i/50)), c=plt.cm.plasma(i/12))

xlims = plt.xlim()
ylims = plt.ylim()
plt.hlines(ylims[0], 0, 10, color='limegreen', lw=1, zorder=4, clip_on=False)
plt.hlines(ylims[0], 10, 20, color='crimson', lw=1, zorder=4, clip_on=False)
plt.vlines(xlims[0], -1, 0, color='limegreen', lw=1, zorder=4, clip_on=False)
plt.vlines(xlims[0], 0, 1, color='crimson', lw=1, zorder=4, clip_on=False)
plt.xlim(xlims)
plt.ylim(ylims)

plt.show()

example plot

要突出显示x轴上的区域,axvlineaxvspan也可能很有趣。一个例子:

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(0, 25, 100)
for i in range(10):
    plt.plot(x, np.sin(x)*(1-i/20), c=plt.cm.plasma(i/12))
plt.axvspan(10, 20, color='paleturquoise', alpha=0.5)
plt.show()

axvspan example