【问题标题】:How can I produce a bar-graph-like plot with truncated bars?如何生成带有截断条形的条形图?
【发布时间】:2020-03-27 21:07:29
【问题描述】:

假设我有两个列表。 我从原始 2dim 列表中提取了最小、最大列表。

循环原始列表,我提取列表。提取列表的值为 -100s 和列表的最小值

例如,从 [0, 0, 1, 3, 10] 列表,返回 [-100, -100, 0]。

在这里,-100 的数量表示列表中最小值的数量(在本例中为 0 的数量)。 0 是列表的最小值。

original = [ [0, 0, 1, 3, 10], [4, 2, 2, 5, 10, 15], [3, 0, 0, 0, 0, 4, 10] ...]
min = [-100, -100, 0, -100, -100, 2, -100, -100, -100, -100 0, ...]
max = [-100, -100, 10, -100, -100, 15, -100, -100, -100, -100, 10, ...]

有了这个列表,我想绘制如下条形图。

如果遇到-100,则通过那个时间。如果不是,则从最小值到最大值绘制条形图。

我还想根据标准给出不同的颜色。

我在 matplotlib example page 或谷歌的搜索结果中找不到很好的例子。

我可以得到这方面的提示吗?

【问题讨论】:

  • 请不要将变量命名为minmax,这样就无法调用同名函数。
  • matplotlib 的 bar 有一个 bottom 参数!
  • @JohanC 当然,我将该列表命名为 min, max 因为显示示例。谢谢你指出:) 我永远不会在我的代码中这样命名。
  • @ImportanceOfBeingErnest 天哪……谢谢。我的错。我从没想过要找到bar 的论点……只是寻找图表的类型。

标签: python list matplotlib plot graph


【解决方案1】:

以下代码使用matplotlib's colourmap 实现了预期的结果:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import colors

min_vals = [-100, -100, 0, -100, -100, 2, -100, -100, -100, -100, 0]
max_vals = [-100, -100, 10, -100, -100, 15, -100, -100, -100, -100, 10]
colours = [1, 1, 2, 1, 1, 3, 1, 1, 1, 1, 2]

w = len(min_vals)
h = max(max_vals) - min(x for x in min_vals if x != -100)

arr = np.ones((h, w), dtype="int")

for i, vals in enumerate(zip(min_vals, max_vals)):
    if -100 not in vals:
        arr[vals[0]:vals[1]:,i] = np.array([colours[i]]*(vals[1]-vals[0]))

cmap = colors.ListedColormap(['white', 'green', 'red'])
fig, ax = plt.subplots(figsize=(6,6))

ax.imshow(arr, cmap=cmap)
plt.gca().invert_yaxis()
plt.yticks(range(h))
plt.xticks(range(w))
plt.show()

输出:

【讨论】:

  • 这是我真正想要的。谢谢你。它运作良好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 2021-09-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 1970-01-01
相关资源
最近更新 更多