Matplotlib 中带圆角的条形图?

Mar*_*kus 6 data-visualization matplotlib bar-chart

如何创建带有圆角的条形图,如图所示?可以用matplotlib完成吗?

带圆角的条形图

ger*_*eth 12

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

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

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)
Run Code Online (Sandbox Code Playgroud)

这会产生以下图:

带有规则矩形的图

为了使矩形具有圆角,我们可以遍历每个矩形补丁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)
Run Code Online (Sandbox Code Playgroud)

这就是我们得到的:

用圆角矩形绘图

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