Python 使用matplotlib为轴脊椎添加多种颜色

Python 使用matplotlib为轴脊椎添加多种颜色,python,matplotlib,charts,Python,Matplotlib,Charts,是否可以在python中使用matplotlib为轴脊椎使用多种颜色 所需的输出样式: 您可以使用行集合创建行集合。然后,可以使用X轴变换将其固定到X轴,与y轴限制无关。将实际脊椎设置为不可见,然后启用clip\u将使线条集合看起来像轴脊椎 import matplotlib.pyplot as plt from matplotlib.collections import LineCollection import numpy as np fig, ax = plt.subplots() c

是否可以在python中使用matplotlib为轴脊椎使用多种颜色

所需的输出样式:


您可以使用
行集合
创建行集合。然后,可以使用X轴变换将其固定到X轴,与y轴限制无关。将实际脊椎设置为不可见,然后启用
clip\u
将使线条集合看起来像轴脊椎

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()

这里有一个稍微不同的解决方案。如果不想重新绘制整个轴,可以使用
zorder
确保原始轴顶部的彩色线段可见

绘制主图后:

  • 保存x和y限制
  • 在ylims[0]处用所需颜色在所选x值之间绘制一条水平线
  • 应关闭剪裁,以允许线在严格的绘图区域外可见
  • zorder
    应足够高,以便将新线放在轴的前面
  • 保存的x和y限制需要放回原处,因为绘制额外的线会移动它们(或者,在绘制彩色轴之前,您可能已通过调用
    plt.autoscale(False)
    关闭轴限制的自动缩放功能)
从matplotlib导入pyplot作为plt
将numpy作为np导入
x=np.linspace(0,20,100)
对于范围(10)内的i:
plt图(x,np.sin(x*(1-i/50)),c=plt.cm.血浆(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()

要突出显示x轴上的某个区域,也可以使用
axvline
axvspan
。例如:

从matplotlib导入pyplot作为plt
将numpy作为np导入
x=np.linspace(0,25100)
对于范围(10)内的i:
plt图(x,np.sin(x)*(1-i/20),c=plt.cm.血浆(i/12))
plt.axvspan(10,20,颜色为淡绿色,α=0.5)
plt.show()

太棒了。你能描述一下transform=ax.get\u xaxis\u transform()的作用吗?我似乎找不到
transform
属性定义。您可能需要阅读。每个艺术家都有变换属性。变换将坐标映射到画布。通常,您不会太在意,因为您希望使用数据坐标,而美工人员在默认情况下使用transData变换。在这里的例子中,我们不想让线在y方向上的位置取决于数据坐标,而是将其固定到轴坐标
ax.get_xaxis_transform()
提供了一个变换,该变换需要以数据单位表示的x坐标和以轴单位表示的y坐标。@ImportanceOfBeingErnest:如果希望线段位于另一个脊椎上(例如,右侧第二个y轴脊椎有偏移(如果有3个y轴),该怎么办?