如何使用where参数使用fill_between

时间:2019-08-30 17:17:40

标签: python-3.x matplotlib

因此,按照本教程,我尝试使用以下代码创建图形:

time_values = [i for i in range(1,100)]
execution_time = [random.randint(0,100) for i in range(1,100)]
fig = plt.figure()
ax1 = plt.subplot()
threshold=[.8 for i in range(len(execution_time))]
ax1.plot(time_values, execution_time)
ax1.margins(x=-.49, y=0)
ax1.fill_between(time_values,execution_time, 1,where=(execution_time>1), color='r', alpha=.3)

这没有用,因为我收到一个错误消息,说我无法比较列表和整数。 但是,我随后尝试:

ax1.fill_between(time_values,execution_time, 1)

这给了我一张图形,其中包含了执行时间和y = 1行之间的所有区域。由于我希望填充y = 1行以上的区域,而使下面的区域没有阴影,我创建了一个名为threshold的列表,并用1填充它,以便可以重新创建比较。但是,

ax1.fill_between(time_values,execution_time, 1,where=(execution_time>threshold)

ax1.fill_between(time_values,execution_time, 1)

创建完全相同的图,即使执行时间值确实超过1。

我感到困惑的原因有两个: 首先,在我正在观看的教程中,老师能够在fill_between函数中成功比较列表和整数,为什么我不能这样做? 其次,为什么where参数不能标识我要填充的区域?即,为什么在y = 1和执行时间值之间的区域中存在图形阴影?

1 个答案:

答案 0 :(得分:0)

问题主要是由于使用python列表而不是numpy数组。显然,您可以使用列表,但是随后您需要在整个代码中使用它们。

function gt_custom_post_type(){
    register_post_type('project',
        array(
            'rewrite' => array('slug' => 'projects'),
            'labels'=> array(
                'name'=> 'Projects',
                'singular_name'=> 'Project',
                'add_new_item'=> 'Add New Project',
                'edit_item' => 'Edit Project'
            ),
            'menu-icon'=> 'dachicons-clipboard',
             'public' => true,
             'has_archive' => true,
             'support' => array(
                 'title', 'thumbnail', 'editor', 'excerpt', 'comments'
             ),

        )
             );
};

add_action('init', 'gt_custom_post_type');

更好的方法是始终使用numpy数组。它不仅速度更快,而且更易于编码和理解。

import numpy as np
import matplotlib.pyplot as plt

time_values = list(range(1,100))
execution_time = [np.random.randint(0,100) for _ in range(len(time_values))]
threshold = 50


fig, ax = plt.subplots()

ax.plot(time_values, execution_time)
ax.fill_between(time_values, execution_time, threshold,
                where= [e > threshold for e in execution_time], 
                color='r', alpha=.3)

ax.set_ylim(0,None)
plt.show()