边缘之间的Matplotlib填充

2024-03-28 22:46:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要创建一个尽可能靠近此图片的绘图(给定以下生成的数据帧代码): enter image description here

这是我的代码的输出图:enter image description here

我遇到的问题是:

  1. 中间填充物的边缘不像图中那样锐利。我有一种白色的影子。如何更改填充之间的线以匹配目标图片
  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)

Tags: inimporttimeplotdefasnpcm
1条回答
网友
1楼 · 发布于 2024-03-28 22:46:54

要在中间设置图例,可以设置^{},也可以将图例放在外部。为了避免图例控制柄变大,可以省略.set_linewidth(12)(这将设置非常宽的边宽度为12点)

将颜色移动一个位置有助于更明显地显示填充边界。要保留正确的图例,则应将标签添加到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)

example plot

相关问题 更多 >