我有一个包含三列数据的数据文件; x和y,表示要绘制的数据点的坐标;和z,这是一个0或1的整数。当z = 0时,我希望用实线绘制数据,当z = 1时,我想用虚线绘制。
我想要这样做的原因是我的数据(x,y)代表微分方程的解,而z编码那些解的稳定性 - z = 0表示稳定解,z = 1表示不稳定。表示稳定性的传统方法是用实线和虚线表示。
如果我使用matplotlib绘制(x,y)而忽略z,我得到以下图:
我使用了以下代码:
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
data = np.genfromtxt('bif.txt')
x, y, z = np.hsplit(data, 3)
font = {'size' : 18}
matplotlib.rc('font', **font)
plt.plot(x, y, linestyle='-',color='b', linewidth=3.0)
plt.ylabel('$||u||_{2}$', fontsize=24, rotation=0, labelpad = 26)
plt.xlabel('$h$', fontsize=24)
plt.tight_layout()
plt.show()
现在基本上,上面的图应该具有交替的虚线和实线分支,具体取决于z的值。有没有办法在Python中执行此操作?
以下是一些示例数据:
0.39464808441470212 7.8834557350383436 0
0.39463345228324243 7.8863501873675874 0
0.39462029602635296 7.8892429033300591 0
0.39460867186795834 7.8921339011986227 0
0.39459862088291187 7.8950232017888187 0
0.39459016704381161 7.8979108278326740 0
0.39458331611262704 7.9007968032693112 0
0.39457805541136221 7.9036811524879083 0
0.39457435446228745 7.9065638995593925 0
0.39457216644773424 7.9094450674925740 0
0.39457143040382697 7.9123246775481046 0
0.39457207403295502 7.9152027486399952 1
0.39457401699683936 7.9180792968496210 1
0.39457717453584740 7.9209543350720102 1
0.39458146125058674 7.9238278728080029 1
0.39458679487846998 7.9266999161098797 1
0.39459309990056007 7.9295704676815966 1
0.39460031082233094 7.9324395271284001 1
0.39460837498580414 7.9353070913444350 1
0.39461725478969767 7.9381731550211647 1
0.39462692921851011 7.9410377112539612 1
0.39463739461045982 7.9439007522198146 1
0.39464866462720694 7.9467622698954790 1
答案 0 :(得分:2)
itertools.groupby
是一个方便的功能,虽然我不知道使用它会影响性能。
例如(从记忆中写):
from itertools import groupby
...
for g_z, group in groupby(zip(zip(x, y), z), lambda p: p[1]):
g_x, g_y = [], []
for i in group:
g_x.append(i[0][0])
g_y.append(i[0][1])
if g_z:
plt.plot(g_x, g_y, linestyle='-')
else:
plt.plot(g_x, g_y, linestyle='--')
...