将哈希模式添加到seaborn条p

2024-06-27 20:52:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我用seaborn创建了一个酒吧。例如,可以按如下方式创建绘图:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
data1 = pd.DataFrame(np.random.rand(17,3), columns=['A','B','C']).assign(Location=1)
data2 = pd.DataFrame(np.random.rand(17,3)+0.2, columns=['A','B','C']).assign(Location=2)
data3 = pd.DataFrame(np.random.rand(17,3)+0.4, columns=['A','B','C']).assign(Location=3)
cdf = pd.concat([data1, data2, data3])
mdf = pd.melt(cdf, id_vars=['Location'], var_name=['Letter'])
ax = sns.barplot(x="Location", y="value", hue="Letter", data=mdf, errwidth=0)  
ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.2), ncol=3, fancybox=True, shadow=True)
plt.show()

这给出了下面的图 enter image description here 我想定制图表如下:

  1. 移除面部颜色(将其设置为白色)
  2. 向图像添加哈希模式以区分组 如何做到这一点?在

Tags: columnsimportdataframeasnppltlocationrandom
1条回答
网友
1楼 · 发布于 2024-06-27 20:52:52

去除脸部颜色很容易,只要做ax.set_facecolor('w'),尽管这会使网格线不可见。我建议在绘图之前使用sns.set_style('whitegrid'),这样您将得到一个只有灰色水平网格线的白色背景。在

至于不同的has模式,这对seaborn来说有点棘手,但这是可以做到的。您可以将hatch关键字参数传递给barplot,但它将应用于每个条,这并不能真正帮助您区分它们。不幸的是,在这里传递字典是行不通的。相反,您可以在构造这些条以应用图案填充之后迭代这些栏。你必须计算出地点的数量,但是这对于熊猫来说是非常简单的。事实证明,seaborn实际上在下一个色调之前绘制每个色调,因此在您的示例中,它将绘制所有蓝色条,然后所有绿色条,然后所有红色条,因此逻辑非常简单:

num_locations = len(mdf.Location.unique())
hatches = itertools.cycle(['/', '//', '+', '-', 'x', '\\', '*', 'o', 'O', '.'])
for i, bar in enumerate(ax.patches):
    if i % num_locations == 0:
        hatch = next(hatches)
    bar.set_hatch(hatch)

所以完整的剧本是

^{pr2}$

我得到输出

example


用于设置图案填充和可用的不同图案填充的参考:http://matplotlib.org/examples/pylab_examples/hatch_demo.html

注意:我调整了你的bbox_to_anchor为图例,因为它部分超出了我电脑上的图形。在

相关问题 更多 >