matplotlib - Matplotlib中带有圆角的条形图?

标签 matplotlib bar-chart data-visualization

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

bar chart with rounded corners

最佳答案

似乎无法直接在条形图中添加圆角。但是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)

这将产生以下图:

a plot with regular rectangles

为了使矩形具有圆角,我们可以遍历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)

这就是我们得到的:

plot with rounded rectangles

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

关于matplotlib - Matplotlib中带有圆角的条形图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58425392/

相关文章:

python - 安装 pyside 后为 matplotlib 设置的默认后端不正确

Python 在使用 PyQt 和 matplotlib 时泄漏内存

python - Pandas 直方图的权重

r - 绘制一个变量变化而其他变量不变的模型的函数

javascript - 图表库开放或商业

python - matplotlib 类型错误 : unsupported operand type(s) for -: 'datetime.date' and 'float'

d3.js 从条形图中子选择一个条形

r - 不影响 R 中边框宽度的阴影线宽度

python - 注释堆叠水平条形图的值

r - 如何在 R/plotROC 中重新调整 ROC 曲线?