首页 > 解决方案 > Matplotlib - 颜色编码数据绘图线?

问题描述

我有一个 python 程序,它读取 tsv 数据并使用 matplotlib 库对其进行绘图。

我觉得我的代码运行良好:

def main(compsPath: str, gibbsPath: str):
    """
    Given the file paths for comps.tsv and
    gibbs.tsv, this main function will
    produce two separate plots - one for each file.
    """

    # Read tsv data into np record arrays
    # Slice off header text

    with open(compsPath, 'r') as fcomps:
        reader = csv.reader(fcomps, delimiter='\t')
        compsHeader = next(reader)
        compsData = np.array(list(reader)).astype(np.double)

    with open(gibbsPath, 'r') as fgibbs:
        reader = csv.reader(fgibbs, delimiter='\t')
        gibbsHeader = next(reader)
        gibbsData = np.array(list(reader)).astype(np.double)

    # Get data dimensions:
    # - - - M := Number of metabolites
    # - - - N := Number of reactions

    M = compsData.shape[1] - 1
    N = gibbsData.shape[1] - 1

    plotComps(M, compsData, compsHeader)
    plotGibbs(N, gibbsData, gibbsHeader)

    plt.show()

plotGibbs 函数为我正在使用的 tsv 文件生成以下图形。对于该图,N=3(3 个反应)。

N = 3 的吉布斯自由能图。

我想指出每个反应在什么时间点变得不利(在我的项目中,这只是意味着反应停止)。当反应的吉布斯自由能值 (ΔG) 大于或等于 0 时,就会发生这种情况。

我觉得我可以通过对我的程序生成的线图进行颜色编码来最好地强调这一点。对于负 ΔG 值,我希望这条线是绿色的,对于正或零 ΔG 值,我希望这条线是红色的。

这是我当前用于生成吉布斯自由能图的代码(没有颜色代码):

def plotGibbs(N: int, gibbsData: np.ndarray, gibbsHeader):

    gibbsFig = plt.figure()
    gibbsFig.suptitle("∆G˚ Yield Plotted over Time (days)")

    numCols = ceil(N / 2)
    numRows = (N // numCols) + 1

    for n in range (1, N+1):
        ax = gibbsFig.add_subplot(numRows, numCols, n)
        ax.set_ylabel(gibbsHeader[n])
        ax.set_xlabel(gibbsHeader[0])
        ax.plot(gibbsData[:, 0], gibbsData[:, n])

    gibbsFig.tight_layout()

我怎样才能使负值绘制为绿色,非负值绘制为红色?

标签: pythonnumpymatplotlib

解决方案


您可以尝试使用np.where 查找数据中符号变化的位置,并使用简单的条件,例如gibbsData[:, n]>0然后相应地绘制负/正数据:

def plotGibbs(N: int, gibbsData: np.ndarray, gibbsHeader):

    gibbsFig = plt.figure()
    gibbsFig.suptitle("∆G˚ Yield Plotted over Time (days)")

    numCols = ceil(N / 2)
    numRows = (N // numCols) + 1

    for n in range (1, N+1):
        ax = gibbsFig.add_subplot(numRows, numCols, n)
        ax.set_ylabel(gibbsHeader[n])
        ax.set_xlabel(gibbsHeader[0])
        # idx where sign change occurs for data n
        idx_zero = np.where(gibbsData[:, n]>0)[0][0]
        # negatives y values
        ax.plot(gibbsData[:idx_zero, 0], gibbsData[:idx_zero,n],'g') 
        # positive y values
        ax.plot(gibbsData[idx_zero:, 0], gibbsData[idx_zero:,n],'r') 

    gibbsFig.tight_layout()

推荐阅读