【问题标题】:Bar chart with rounded corners in Matplotlib?Matplotlib中带圆角的条形图?
【发布时间】:2020-02-13 22:45:07
【问题描述】:

如何创建圆角条形图,如图所示?用matplotlib可以吗?

【问题讨论】:

  • 可以使用FancyBboxPatch,如here。用这些来构建图表会很麻烦,但肯定有可能。

标签: matplotlib bar-chart data-visualization


【解决方案1】:

看起来没有办法直接向条形图添加圆角。但 matplotlib 确实提供了一个 FancyBboxPatch 类,该类的演示可在 here 获得。

所以为了创建一个像问题中所示的图,我们可以先制作一个简单的水平条形图:

import pandas as pd
import numpy as np
# make up some example data
np.random.seed(0)
df = pd.DataFrame(np.random.uniform(0,20, size=(4,4)))
df = df.div(df.sum(1), axis=0)
# plot a stacked horizontal bar chart
ax = df.plot.barh(stacked=True, width=0.98, legend=False)
ax.figure.set_size_inches(6,6)

这会产生以下情节:

为了使矩形具有圆角,我们可以遍历ax.patches 中的每个矩形补丁并将其替换为FancyBboxPatch。这个带有圆角的新花式贴片从旧贴片复制位置和颜色,因此我们不必担心放置。

from matplotlib.patches import FancyBboxPatch
ax = df.plot.barh(stacked=True, width=1, legend=False)
ax.figure.set_size_inches(6,6)
new_patches = []
for patch in reversed(ax.patches):
    bb = patch.get_bbox()
    color=patch.get_facecolor()
    p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),
                        abs(bb.width), abs(bb.height),
                        boxstyle="round,pad=-0.0040,rounding_size=0.015",
                        ec="none", fc=color,
                        mutation_aspect=4
                        )
    patch.remove()
    new_patches.append(p_bbox)
for patch in new_patches:
    ax.add_patch(patch)

这就是我们得到的结果:

我给了盒子一个负填充,以便条形之间有间隙。这些数字有点黑魔法。不知道rounding_sizepad 的单位是什么。 mutation_aspect 显示在最后一个演示示例中,这里我将其设置为 4,因为 y 范围约为 4 而x 范围约为 1。

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多