Python: Is it possible to change line color in a plot if exceeds a specific range?

后端 未结 4 868
刺人心
刺人心 2020-11-30 06:30

Is it possible to change the line color in a plot when values exceeds a certain y value? Example:

import numpy as np
import matplotlib.pyplot as plt
a = np.a         


        
4条回答
  •  甜味超标
    2020-11-30 06:53

    Unfortunately, matplotlib doesn't have an easy option to change the color of only part of a line. We will have to write the logic ourselves. The trick is to cut the line up into a collection of line segments, then assign a color to each of them, and then plot them.

    from matplotlib import pyplot as plt
    from matplotlib.collections import LineCollection
    import numpy as np
    
    # The x and y data to plot
    y = np.array([1,2,17,20,16,3,5,4])
    x = np.arange(len(y))
    
    # Threshold above which the line should be red
    threshold = 15
    
    # Create line segments: 1--2, 2--17, 17--20, 20--16, 16--3, etc.
    segments_x = np.r_[x[0], x[1:-1].repeat(2), x[-1]].reshape(-1, 2)
    segments_y = np.r_[y[0], y[1:-1].repeat(2), y[-1]].reshape(-1, 2)
    
    # Assign colors to the line segments
    linecolors = ['red' if y_[0] > threshold and y_[1] > threshold else 'blue'
                  for y_ in segments_y]
    
    # Stamp x,y coordinates of the segments into the proper format for the
    # LineCollection
    segments = [zip(x_, y_) for x_, y_ in zip(segments_x, segments_y)]
    
    # Create figure
    plt.figure()
    ax = plt.axes()
    
    # Add a collection of lines
    ax.add_collection(LineCollection(segments, colors=linecolors))
    
    # Set x and y limits... sadly this is not done automatically for line
    # collections
    ax.set_xlim(0, 8)
    ax.set_ylim(0, 21)
    

    First option

    Your second option is much easier. We first draw the line and then add the markers as a scatterplot on top of it:

    from matplotlib import pyplot as plt
    import numpy as np
    
    # The x and y data to plot
    y = np.array([1,2,17,20,16,3,5,4])
    x = np.arange(len(y))
    
    # Threshold above which the markers should be red
    threshold = 15
    
    # Create figure
    plt.figure()
    
    # Plot the line
    plt.plot(x, y, color='blue')
    
    # Add below threshold markers
    below_threshold = y < threshold
    plt.scatter(x[below_threshold], y[below_threshold], color='green') 
    
    # Add above threshold markers
    above_threshold = np.logical_not(below_threshold)
    plt.scatter(x[above_threshold], y[above_threshold], color='red') 
    

    Second option

提交回复
热议问题