使用matplotlib更改特定值范围的线条样式

时间:2014-11-22 20:39:15

标签: python-2.7 matplotlib plot

我需要重现这种类型的图(分叉图) -

bifurcation plot

我尝试按照change-matplotlib-line-style-mid-graph给出的示例,但无法解决问题。有人可以提示吗?

1 个答案:

答案 0 :(得分:2)

以下我将4个不同的例子放在一起。他们展示了不同的东西:

  1. 在您的问题中重新创建图表的最简单方法。请注意,每行仅由两个点定义。
  2. 这就是我所假设的:两个x和y向量定义每一行(在我的例子中,它们每个都有100个值)。
  3. 这个对你来说最有意思(我猜):向量solid1solid2用于选择满足条件的x和y值。
  4. 只是为了向您展示如何将刺刺放在中心位置(因为问题中的图形使它们居中)。
  5. enter image description here

    代码:

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.figure(figsize=(12,4))
    
    # Example 1
    plt.subplot(1,4,1)
    line1 = np.array([[-1,0],[0,0]])
    line2 = np.array([[0,0],[1,1]])
    line3 = np.array([[-1,-1],[0,0]])
    line4 = np.array([[0,0],[1,0]])
    plt.plot(line1[:,0], line1[:,1], 'b', linewidth=4)
    plt.plot(line2[:,0], line2[:,1], 'b', linewidth=4)
    plt.plot(line3[:,0], line3[:,1], 'b--', linewidth=4)
    plt.plot(line4[:,0], line4[:,1], 'b--', linewidth=4)
    
    # Example 2
    plt.subplot(1,4,2)
    x1 = np.linspace(-1,1,100)
    x2 = np.linspace(-1,1,100)
    y1 = x1*0
    y2 = x2
    plt.plot(x1,y1,'r', linewidth=4)
    plt.plot(x2,y2,'g', linewidth=4)
    
    # Example 3
    plt.subplot(1,4,3)
    #some sort of split condition:
    solid1 = x1<0
    solid2 = x2>0
    #plot each line in two seperate plot calls
    plt.plot(x1[solid1], y1[solid1], 'r', linewidth=4)
    plt.plot(x1[np.logical_not(solid1)], y1[np.logical_not(solid1)], 'r--', linewidth=4)
    plt.plot(x2[solid2], y2[solid2], 'g', linewidth=4)
    plt.plot(x2[np.logical_not(solid2)], y2[np.logical_not(solid2)], 'g--', linewidth=4)
    
    # Example 4 
    plt.subplot(1,4,4)
    # put the spines to the middle
    ax = plt.gca()
    ax.spines['left'].set_position('center')
    ax.spines['right'].set_color('none')
    ax.spines['bottom'].set_position('center')
    ax.spines['top'].set_color('none')
    ax.spines['left'].set_smart_bounds(True)
    ax.spines['bottom'].set_smart_bounds(True)
    ax.xaxis.set_ticks_position('bottom')
    ax.yaxis.set_ticks_position('left')
    
    plt.show()