Matplotlib彩色编码数据打印线?

2024-10-04 11:31:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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()

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


Tags: 程序fortsvmaindefnpaxreader
1条回答
网友
1楼 · 发布于 2024-10-04 11:31:54

您可以尝试使用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()

相关问题 更多 >