Matplotlib 直方图或 Seaborn 分布图的 bin 上没有轮廓
Posted
技术标签:
【中文标题】Matplotlib 直方图或 Seaborn 分布图的 bin 上没有轮廓【英文标题】:No outlines on bins of Matplotlib histograms or Seaborn distplots 【发布时间】:2017-08-22 03:48:49 【问题描述】:在使用 seaborn 和 Jupyter 笔记本做一些练习题时,我意识到 distplot() 图在各个 bin 上没有文档中所有示例图所具有的较暗轮廓。我尝试使用 Pycharm 创建图表并注意到同样的事情。认为这是一个海洋问题,我尝试了一些使用 matplotlib 的 hist() 图表,但得到了相同的结果。
import matplotlib.pyplot as plt
import seaborn as sns
titanic = sns.load_dataset('titanic')
plt.hist(titanic['fare'], bins=30)
生成了以下图表:
最后我偶然发现了 plt.hist() 函数上的 'edgecolor' 参数,并将其设置为黑色就可以了。不幸的是,我还没有找到在 seaborn distplot() 函数上使用的类似参数,所以我仍然无法获得看起来应该的图表。
我研究过在 matplotlib 中更改 rcParams,但我没有这方面的经验,而且我运行的以下脚本似乎什么也没做:
import matplotlib as mpl
mpl.rcParams['lines.linewidth'] = 1
mpl.rcParams['lines.color'] = 'black'
mpl.rcParams['patch.linewidth'] = 1
mpl.rcParams['patch.edgecolor'] = 'black'
mpl.rcParams['axes.linewidth'] = 1
mpl.rcParams['axes.edgecolor'] = 'black'
我只是在猜测我应该更改的值,但再次运行我的图表显示没有任何变化。
然后我尝试使用 mpl.rcdefaults() 回到默认设置 但再一次,没有变化。
我使用 conda 重新安装了 matplotlib,但图形看起来仍然相同。我对如何更改这些图表的默认边缘颜色没有任何想法。我正在使用 Conda 构建运行最新版本的 Python、matplotlib 和 seaborn。
【问题讨论】:
【参考方案1】:使用 seaborn 中可用的样式也可以解决您的问题。 seaborn 中可用的样式有:
-
滴答声
黑暗
暗格
白色
白格
【讨论】:
【参考方案2】:截至 2021 年 3 月:
sns.histplot(data, edgecolor='k', linewidth=2)
工作。
使用hist_kws=dict(edgecolor="k", linewidth=2)
报错:AttributeError: 'PolyCollection' object has no property 'hist_kws'
【讨论】:
如您所见,hist_kws
是 sns.distplot()
的参数,但不是 sns.histplot()
...【参考方案3】:
作为 matplotlib 2.0 更新的一部分,条形图上的边是 turned off by default。但是,您可以使用 rcParam
plt.rcParams["patch.force_edgecolor"] = True
全局开启边缘。
可能最简单的选择是在创建 seaborn 绘图时专门设置边缘颜色,使用 hist_kws
参数,
ax = sns.distplot(x, hist_kws=dict(edgecolor="k", linewidth=2))
对于 matplotlib 绘图,您可以直接使用 edgecolor
或 ec
参数。
plt.bar(x,y, edgecolor="k")
plt.hist(x, edgecolor="k")
同样,对于熊猫地块,
df.plot(kind='hist',edgecolor="k")
一个完整的 seaborn 示例:
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
x = np.random.randn(100)
ax = sns.distplot(x, hist_kws=dict(edgecolor="k", linewidth=2))
plt.show()
【讨论】:
我肯定在重复使用:“总的来说,seaborn 在样式设置方面非常贪婪。” 感谢回复,之前没用过 hist_kws 参数。您说 seaborn 中的边缘颜色/线宽可能没有全局设置,但是 matplotlib 的 hist() 函数是否有全局设置?我假设 seaborn 使用 hist() 的许多默认设置来创建它的 distplot(),因此更改 matplotlib 的设置也会改变我的 seaborn 图表。我只是对我的图表中的 bin 本身没有任何轮廓感到困惑,而我在网上看到的所有其他图表都有它们而无需明确给出论点。 在 matplotlib 版本 2 中hist
没有边缘,而在低于 2 的版本中默认情况下它们是打开的(这可能是看到很多带有边缘的示例的原因)。 Seaborn 默认情况下也将它们关闭。但是,我实际上错了,有一个名为"patch.force_edgecolor"
的全局设置将为所有补丁设置边缘,还有条形图中的条形。我更新了答案。
尽管有名称,hist_kws
是 seaborn.distplot()
的参数,但 不是 seaborn.histplot()
...以上是关于Matplotlib 直方图或 Seaborn 分布图的 bin 上没有轮廓的主要内容,如果未能解决你的问题,请参考以下文章
python数据可视化(matplotlib,seaborn,plotly)
Matplotlib学习---用seaborn画直方图和核密度图(histogram & kdeplot)