簡體   English   中英

Matplotlib fill_between edge

[英]Matplotlib fill_between edge

我需要創建一個 plot 盡可能接近這張圖片(鑒於下面生成的 dataframe 代碼): 在此處輸入圖像描述

這是我的代碼的 output plot: 在此處輸入圖像描述

我遇到的問題是:

  1. fill_between 的邊緣並不像圖片中那樣銳利。 我所擁有的是某種白色陰影。 如何更改填充物之間的線條以匹配目標圖片?
  2. 我如何將圖例顏色線對准中心,而不是我的代碼所做的左邊框?

這是我的代碼:

import matplotlib.pyplot as plt
import matplotlib.colors as colors
import matplotlib.cm as cm
import numpy as np
import pandas as pd

ncols = 10
figsize = (20, 5)
fontsize = 14

dti = pd.date_range('2013-01-01', '2020-12-31', freq='2W')
probabilities_in_time = np.random.random((ncols, len(dti)))
probabilities_in_time = probabilities_in_time / \
    probabilities_in_time.sum(axis=0)
probabilities_in_time = pd.DataFrame(probabilities_in_time).T
probabilities_in_time.index = dti

cm_subsection = np.linspace(0, 1, ncols)
colors = [cm.coolwarm(x) for x in cm_subsection]


def plot_time_probabilities(probabilities_in_time, figsize):
    plt.figure(figsize=figsize)
    plt.yticks(np.arange(0, 1.2, 0.2), fontsize=fontsize)
    plt.xticks(fontsize=fontsize)

    draw_stack_plot(colors, probabilities_in_time)
    set_grid()
    set_legend()

    plt.show()


def draw_stack_plot(colors, probabilities_in_time):
    for i, color in enumerate(colors):
        if i == 0:
            plt.plot(probabilities_in_time[i], color=color)
            plt.fill_between(probabilities_in_time.index,
                             probabilities_in_time[0], color=color)

        else:
            probabilities_in_time[i] += probabilities_in_time[i-1]
            plt.fill_between(probabilities_in_time.index,
                             probabilities_in_time[i], probabilities_in_time[i-1],
                             color=color)

        plt.plot(probabilities_in_time[i], label=' Probability: {}'.format(
            i), color=color)


def set_grid():
    ax = plt.gca()
    ax.set_axisbelow(False)
    ax.xaxis.grid(True, linestyle='-', lw=1)


def set_legend():
    leg = plt.legend(loc='lower left', fontsize=14, handlelength=1.3)
    for i in leg.legendHandles:
        i.set_linewidth(12)


plot_time_probabilities(probabilities_in_time, figsize)

要將圖例設置在中心,可以設置loc='center' ,也可以將圖例放在外面。 為避免圖例句柄變大,您可以省略.set_linewidth(12) (這會設置 12 點的非常寬的邊緣寬度)。

將 colors 移動一個 position 可以幫助顯示更明顯的填充邊界。 為了仍然有一個正確的圖例,label 應該被添加到fill_between

下面的代碼還試圖簡化部分調用:

import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
import pandas as pd

ncols = 10
figsize = (20, 5)
fontsize = 14

dti = pd.date_range('2013-01-01', '2020-12-31', freq='2W')
probabilities_in_time = np.random.random((ncols, len(dti)))
probabilities_in_time = probabilities_in_time / probabilities_in_time.sum(axis=0)
probabilities_in_time = pd.DataFrame(probabilities_in_time).T
probabilities_in_time.index = dti

cm_subsection = np.linspace(0, 1, ncols)
colors = cm.coolwarm(cm_subsection)

def plot_time_probabilities(probabilities_in_time, figsize):
    plt.figure(figsize=figsize)
    plt.yticks(np.arange(0, 1.2, 0.2), fontsize=fontsize)
    plt.xticks(fontsize=fontsize)

    draw_stack_plot(colors, probabilities_in_time)
    set_grid()
    set_legend()
    # plt.margins(x=0, y=0)
    plt.margins(x=0.02)
    plt.tight_layout()
    plt.show()

def draw_stack_plot(colors, probabilities_in_time):
    current_probabilities = 0
    for i, color in enumerate(colors):
        plt.fill_between(probabilities_in_time.index,
                         probabilities_in_time[i] + current_probabilities, current_probabilities,
                         color=color, label=f' Probability: {i}')
        current_probabilities += probabilities_in_time[i]

        plt.plot(current_probabilities,
                 color=colors[0] if i <= 1 else colors[-1] if i >= 8 else colors[i - 1] if i < 5 else colors[i + 1])

def set_grid():
    ax = plt.gca()
    ax.set_axisbelow(False)
    ax.xaxis.grid(True, linestyle='-', lw=1)

def set_legend():
    leg = plt.legend(loc='lower left', fontsize=14, handlelength=1.3)
    # leg = plt.legend(loc='upper left', bbox_to_anchor=(1.01, 1), fontsize=14, handlelength=1.3)
    # for i in leg.legendHandles:
    #    i.set_linewidth(12)

plot_time_probabilities(probabilities_in_time, figsize)

示例圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM