Adding value labels on a matplotlib bar chart

后端 未结 5 2085
广开言路
广开言路 2020-11-22 08:24

I got stuck on something that feels like should be relatively easy. The code I bring below is a sample based on a larger project I\'m working on. I saw no reason to post all

5条回答
  •  野趣味
    野趣味 (楼主)
    2020-11-22 08:41

    Building off the above (great!) answer, we can also make a horizontal bar plot with just a few adjustments:

    # Bring some raw data.
    frequencies = [6, -16, 75, 160, 244, 260, 145, 73, 16, 4, 1]
    
    freq_series = pd.Series(frequencies)
    
    y_labels = [108300.0, 110540.0, 112780.0, 115020.0, 117260.0, 119500.0, 
                121740.0, 123980.0, 126220.0, 128460.0, 130700.0]
    
    # Plot the figure.
    plt.figure(figsize=(12, 8))
    ax = freq_series.plot(kind='barh')
    ax.set_title('Amount Frequency')
    ax.set_xlabel('Frequency')
    ax.set_ylabel('Amount ($)')
    ax.set_yticklabels(y_labels)
    ax.set_xlim(-40, 300) # expand xlim to make labels easier to read
    
    rects = ax.patches
    
    # For each bar: Place a label
    for rect in rects:
        # Get X and Y placement of label from rect.
        x_value = rect.get_width()
        y_value = rect.get_y() + rect.get_height() / 2
    
        # Number of points between bar and label. Change to your liking.
        space = 5
        # Vertical alignment for positive values
        ha = 'left'
    
        # If value of bar is negative: Place label left of bar
        if x_value < 0:
            # Invert space to place label to the left
            space *= -1
            # Horizontally align label at right
            ha = 'right'
    
        # Use X value as label and format number with one decimal place
        label = "{:.1f}".format(x_value)
    
        # Create annotation
        plt.annotate(
            label,                      # Use `label` as label
            (x_value, y_value),         # Place label at end of the bar
            xytext=(space, 0),          # Horizontally shift label by `space`
            textcoords="offset points", # Interpret `xytext` as offset in points
            va='center',                # Vertically center label
            ha=ha)                      # Horizontally align label differently for
                                        # positive and negative values.
    
    plt.savefig("image.png")
    

    horizontal bar plot with annotations

提交回复
热议问题