去除脸部颜色很简单,只需要做ax.set_facecolor('w')
,尽管这会使网格线不可见。我建议使用sns.set_style('whitegrid')
在绘图之前,您将获得白色背景,只有灰色的水平网格线。
至于不同的模式,这对于seaborn来说有点棘手,但它是可以做到的。您可以通过hatch
barplot 的关键字参数,但它将应用于每个条形图,这并不能真正帮助您区分它们。不幸的是,在这里传递字典是行不通的。相反,您可以在构建条形后对其进行迭代以应用剖面线。您必须计算位置的数量,但这对于 pandas 来说非常简单。事实证明,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)
所以完整的脚本是
import itertools
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
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)
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)
ax.legend(loc='upper center', bbox_to_anchor=(0.5, 1.1), ncol=3, fancybox=True, shadow=True)
plt.show()
我得到输出
设置舱口和可用的不同舱口的参考:http://matplotlib.org/examples/pylab_examples/hatch_demo.html http://matplotlib.org/examples/pylab_examples/hatch_demo.html
注意:我调整了你的bbox_to_anchor
对于图例,因为它部分位于我计算机上的图形之外。