python - 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 个反应)。
我想指出每个反应在什么时间点变得不利(在我的项目中,这只是意味着反应停止)。当反应的吉布斯自由能值 (Δ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()
我怎样才能使负值绘制为绿色,非负值绘制为红色?
解决方案
您可以尝试使用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()
推荐阅读
- python - 具有修复资源的多处理
- java - (已解决)使用 Files.copy API 复制的文件在库中不可见
- r - 在 R 中可视化几列的正确方法是什么?
- react-native - React Native Navigation 导航未从 useEffect 触发
- python - 根据前两个字母删除分类变量
- mysql - 使用多语言站点(polylang)搜索和替换查询
- linux - Flutter linux build error A required package was not found
- java - Quartz Scheduler + Spring:创建触发器时如何从JobStore获取初始cron表达式?
- javascript - 不能让测试失败?选择器可能是错误的
- c++ - Opencv.exe 中 0x00007FFFB9423B29 处未处理的异常:Microsoft C++ 异常:内存位置的 cv::Exception