Matplotlib-对数据绘图线进行颜色编码?

时间:2020-10-11 19:34:07

标签: python numpy 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个反应)。

Gibbs free energy plots for 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()

如何使负值显示为绿色,非负值显示为红色?

1 个答案:

答案 0 :(得分:1)

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

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