如何在 pandas 中添加堆积条形图阴影线? (...或者如何在 pandas plot vs. matplotlib 中获取 BarContainer vs AxisSubplot?)
How to to add stacked bar plot hatching in pandas? (...or how to get BarContainer vs AxisSubplot in pandas plot vs. matplotlib?)
我有一个使用 matplotlib.pyplot.plot()
的代码示例有效,我想复制它以在堆叠条形图上制作阴影条形段。然而,我一直在使用 pandas.DataFrame.plot()
而不是 matplotlib.pyplot.plot()
来制作我所有的其他图形,我也想在这里继续这样做。示例代码 returns BarContainer
对象的元组和 pandas.DataFrame.plot()
returns 一个 AxisSubplot
对象,我不知道如何在两者之间导航。
关于如何从 pandas.DataFrame.plot()
中获取 BarContainer
对象以便我可以使用它们来复制示例的任何建议?
如果没有,关于如何使用 pandas.DataFrame.plot()
实现我在堆积条形图上为每个彩色条形段添加阴影线的目标有什么建议吗?
对于我的数据,阴影线将有助于区分相似的颜色,因为我有很多类别和项目,否则结果在视觉上看起来很相似。 (我知道我也可以找到一种方法来绘制更简单的东西,但这对我的探索性数据分析很有帮助。)谢谢!
示例工作代码孵化堆叠条形图的每个彩色条形段(来自此处:https://matplotlib.org/examples/pylab_examples/hatch_demo.html):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax2 = fig.add_subplot(111)
bars = ax2.bar(range(1, 5), range(1, 5), color='yellow', ecolor='black') + \
ax2.bar(range(1, 5), [6] * 4, bottom=range(1, 5), color='green', ecolor='black')
patterns = ('-', '+', 'x', '\', '*', 'o', 'O', '.')
for bar, pattern in zip(bars, patterns):
bar.set_hatch(pattern)
我希望我的代码(带有简化数据)有每个彩色条形段的影线:
df = pd.DataFrame(np.random.uniform(0,10, size=(5,26)))
df.columns=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
ax = df.plot.barh(stacked=True, width=0.98, figsize=(10,5), cmap='gist_ncar')
how to get BarContainer objects out of pandas.DataFrame.plot()
从 Axes' 容器属性中过滤掉它们
>>> import matplotlib as mpl
>>> ax = df.plot.barh(stacked=True, width=0.98, figsize=(10,5), cmap='gist_ncar')
>>> ax.containers[:4]
[<BarContainer object of 5 artists>, <BarContainer object of 5 artists>, <BarContainer object of 5 artists>, <BarContainer object of 5 artists>]
>>> bars = [thing for thing in ax.containers if isinstance(thing,mpl.container.BarContainer)]
在每个 BarContainer 的矩形上设置影线。
import itertools
patterns = itertools.cycle(('-', '+', 'x', '\', '*', 'o', 'O', '.'))
for bar in bars:
for patch in bar:
patch.set_hatch(next(patterns))
L = ax.legend() # so hatches will show up in the legend
这样做将确保您不会获取不属于酒吧的 Patch。
how to get the same patches to show up on the same colors across different items
也许在遍历每个条中的补丁时,检查其 facecolor (patch.get_facecolor
) 并维护 {facecolor:hatchsymbol} 的字典 - 如果 facecolor 在字典集中 that hatch 否则得到一个新的 hatch 符号,将它和颜色添加到设置 hatch 的字典中。
d = {}
for bar in bars:
for patch in bar:
pat = d.setdefault(patch.get_facecolor(), next(patterns))
patch.set_hatch(pat)
L = ax.legend()
Matplotlib Tutorials 是值得的。
我有一个使用 matplotlib.pyplot.plot()
的代码示例有效,我想复制它以在堆叠条形图上制作阴影条形段。然而,我一直在使用 pandas.DataFrame.plot()
而不是 matplotlib.pyplot.plot()
来制作我所有的其他图形,我也想在这里继续这样做。示例代码 returns BarContainer
对象的元组和 pandas.DataFrame.plot()
returns 一个 AxisSubplot
对象,我不知道如何在两者之间导航。
关于如何从 pandas.DataFrame.plot()
中获取 BarContainer
对象以便我可以使用它们来复制示例的任何建议?
如果没有,关于如何使用 pandas.DataFrame.plot()
实现我在堆积条形图上为每个彩色条形段添加阴影线的目标有什么建议吗?
对于我的数据,阴影线将有助于区分相似的颜色,因为我有很多类别和项目,否则结果在视觉上看起来很相似。 (我知道我也可以找到一种方法来绘制更简单的东西,但这对我的探索性数据分析很有帮助。)谢谢!
示例工作代码孵化堆叠条形图的每个彩色条形段(来自此处:https://matplotlib.org/examples/pylab_examples/hatch_demo.html):
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax2 = fig.add_subplot(111)
bars = ax2.bar(range(1, 5), range(1, 5), color='yellow', ecolor='black') + \
ax2.bar(range(1, 5), [6] * 4, bottom=range(1, 5), color='green', ecolor='black')
patterns = ('-', '+', 'x', '\', '*', 'o', 'O', '.')
for bar, pattern in zip(bars, patterns):
bar.set_hatch(pattern)
我希望我的代码(带有简化数据)有每个彩色条形段的影线:
df = pd.DataFrame(np.random.uniform(0,10, size=(5,26)))
df.columns=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
ax = df.plot.barh(stacked=True, width=0.98, figsize=(10,5), cmap='gist_ncar')
how to get BarContainer objects out of pandas.DataFrame.plot()
从 Axes' 容器属性中过滤掉它们
>>> import matplotlib as mpl
>>> ax = df.plot.barh(stacked=True, width=0.98, figsize=(10,5), cmap='gist_ncar')
>>> ax.containers[:4]
[<BarContainer object of 5 artists>, <BarContainer object of 5 artists>, <BarContainer object of 5 artists>, <BarContainer object of 5 artists>]
>>> bars = [thing for thing in ax.containers if isinstance(thing,mpl.container.BarContainer)]
在每个 BarContainer 的矩形上设置影线。
import itertools
patterns = itertools.cycle(('-', '+', 'x', '\', '*', 'o', 'O', '.'))
for bar in bars:
for patch in bar:
patch.set_hatch(next(patterns))
L = ax.legend() # so hatches will show up in the legend
这样做将确保您不会获取不属于酒吧的 Patch。
how to get the same patches to show up on the same colors across different items
也许在遍历每个条中的补丁时,检查其 facecolor (patch.get_facecolor
) 并维护 {facecolor:hatchsymbol} 的字典 - 如果 facecolor 在字典集中 that hatch 否则得到一个新的 hatch 符号,将它和颜色添加到设置 hatch 的字典中。
d = {}
for bar in bars:
for patch in bar:
pat = d.setdefault(patch.get_facecolor(), next(patterns))
patch.set_hatch(pat)
L = ax.legend()
Matplotlib Tutorials 是值得的。