使用可变的linestyle在Python中绘制一条线

时间:2015-09-04 11:19:01

标签: python matplotlib plot

我有一个包含三列数据的数据文件; x和y,表示要绘制的数据点的坐标;和z,这是一个0或1的整数。当z = 0时,我希望用实线绘制数据,当z = 1时,我想用虚线绘制。

我想要这样做的原因是我的数据(x,y)代表微分方程的解,而z编码那些解的稳定性 - z = 0表示稳定解,z = 1表示不稳定。表示稳定性的传统方法是用实线和虚线表示。

如果我使用matplotlib绘制(x,y)而忽略z,我得到以下图:enter image description here

我使用了以下代码:

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

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='--')
...