在数据分析和可视化中,堆叠条形图是一种非常有用的工具,能够直观地展示不同类别在各个样本中的分布情况。而为堆叠图添加填充纹理,则可以让图表更加美观且富有层次感。今天,我们将通过 python 的 matplotlib 库来实现这种带填充纹理的堆叠图。
一、安装 matplotlib 库
在开始绘制图表之前,我们需要确保已经安装了 matplotlib 库。如果你尚未安装 matplotlib,可以通过【win】+【r】打开【运行】,并输入[cmd],点击确定,并输入以下命令进行安装:
pip install matplotlib
安装完成后,你就可以在 python 脚本中导入并使用 matplotlib 了。
二、数据准备
为了绘制堆叠图,我们需要准备一些数据。在本例中,我们使用一个 json 格式的数据结构来存储样本数、rmse 值以及类别标签。以下是数据的具体格式:
data = { "samples": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "rmse_values": [ [0.15, 0.2, 0.25], [0.3, 0.35, 0.3], [0.25, 0.3, 0.35], [0.2, 0.25, 0.3], [0.18, 0.22, 0.28], [0.2, 0.24, 0.29], [0.22, 0.26, 0.31], [0.19, 0.23, 0.32], [0.17, 0.21, 0.33], [0.16, 0.2, 0.34], [0.14, 0.19, 0.35], [0.13, 0.18, 0.36], [0.12, 0.17, 0.37] ], "labels": ["a", "b", "c", "d"] }
其中:
samples
表示样本编号。rmse_values
是一个二维列表,每一行对应一个样本,每一列对应一个类别的值。labels
是类别的标签。
三、设置绘图风格和字体
在绘制图表之前,我们需要设置合适的绘图风格和字体,以确保图表的美观性和可读性。matplotlib 提供了多种预设的绘图风格,例如 seaborn-v0_8-colorblind
,这种风格适合色盲用户,能够提供清晰的视觉效果。
import matplotlib.pyplot as plt # 检查可用样式 print("available styles:", plt.style.available) # 设置绘图风格和字体 plt.style.use('seaborn-v0_8-colorblind') # 使用可用的样式 plt.rcparams.update({ 'font.family': 'simhei', 'font.size': 10, 'axes.unicode_minus': false })
四、绘制堆叠条形图并添加纹理
接下来,我们将使用 matplotlib 的bar
方法来绘制堆叠条形图。为了实现纹理填充,我们需要为每个条形图指定 hatch
参数。以下是完整的代码实现:
import numpy as np # 创建图形和坐标轴对象,调整图形大小为 (10, 6) fig, ax = plt.subplots(figsize=(10, 6)) # 调整图形大小 # 定义颜色和纹理 colors = ['navy', 'teal', 'mediumaquamarine', 'khaki'] # 定义每个类别的颜色 hatches = ['xx', '', '\\\\', '//'] # 定义每个类别的纹理 # 初始化底部位置 bottom = np.zeros(len(data["samples"])) # 绘制堆叠条形图并添加纹理 for i, label in enumerate(data["labels"]): if i < 3: # 只有三个类别需要绘制,因为数据中只有三个值 values = [item[i] for item in data["rmse_values"]] # 提取每个样本对应类别的值 # 绘制条形图,并应用颜色和纹理 bars = ax.bar(data["samples"], values, bottom=bottom, color=colors[i], hatch=hatches[i], label=label, edgecolor='black', width=0.6) bottom += values # 更新底部位置以便堆叠下一个类别
五、添加图表元素
为了让图表更加完整和易于理解,我们需要添加坐标轴标签、标题、图例以及网格线。
# 设置坐标轴标签和标题 ax.set_xlabel('样本数') # 设置x轴标签 ax.set_ylabel('rmse (米)') # 设置y轴标签 ax.set_title('纹理填充堆叠条形图') # 设置图表标题为中文 # 添加图例 ax.legend(loc='upper right') # 设置图例位置 # 设置网格和坐标轴范围 ax.grid(true, axis='y', linestyle='--', alpha=0.7) # 添加网格线 ax.set_ylim(0, 1.5) # 设置y轴范围
六、显示和保存图表
最后,我们使用 plt.show()
方法来显示图表。如果需要保存图表,可以使用 plt.savefig()
方法。
# 显示图表 plt.show() # 关闭绘图窗口 plt.close()
七、效果展示
运行上述代码后,你将得到一个带有填充纹理的堆叠条形图。每个条形图的纹理和颜色都清晰可见,能够直观地展示不同类别在各个样本中的分布情况。
八、完整代码展示
import matplotlib.pyplot as plt import numpy as np # 从json格式的数据中提取需要绘制的图表信息 data = { "samples": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], "rmse_values": [ [0.15, 0.2, 0.25], [0.3, 0.35, 0.3], [0.25, 0.3, 0.35], [0.2, 0.25, 0.3], [0.18, 0.22, 0.28], [0.2, 0.24, 0.29], [0.22, 0.26, 0.31], [0.19, 0.23, 0.32], [0.17, 0.21, 0.33], [0.16, 0.2, 0.34], [0.14, 0.19, 0.35], [0.13, 0.18, 0.36], [0.12, 0.17, 0.37] ], "labels": ["a", "b", "c", "d"] } # 检查可用样式 print("available styles:", plt.style.available) # 设置绘图风格和字体 plt.style.use('seaborn-v0_8-colorblind') # 使用可用的样式 # 设置支持中文的字体 plt.rcparams.update({ 'font.family': 'simhei', 'font.size': 10, 'axes.unicode_minus': false }) # 创建图形和坐标轴对象,调整图形大小为 (10, 6) fig, ax = plt.subplots(figsize=(10, 6)) # 调整图形大小 # 定义颜色和纹理 colors = ['navy', 'teal', 'mediumaquamarine', 'khaki'] hatches = ['xx', '', '\\\\', '//'] # 绘制堆叠条形图并添加纹理 bottom = np.zeros(len(data["samples"])) for i, label in enumerate(data["labels"]): if i < 3: values = [item[i] for item in data["rmse_values"]] # 绘制条形图,并应用颜色和纹理 bars = ax.bar(data["samples"], values, bottom=bottom, color=colors[i], hatch=hatches[i], label=label, edgecolor='black', width=0.6) bottom += values # 更新底部位置以便堆叠下一个类别 # 设置坐标轴标签和标题 ax.set_xlabel('样本数') ax.set_ylabel('rmse (米)') ax.set_title('纹理填充堆叠条形图') # 添加图例 ax.legend(loc='upper right') # 设置网格和坐标轴范围 ax.grid(true, axis='y', linestyle='--', alpha=0.7) ax.set_ylim(0, 1.5) # 显示图表 plt.show() # 关闭绘图窗口 plt.close()
九、总结
通过 matplotlib,我们可以轻松地实现带填充纹理的堆叠图。这种图表不仅美观,还能提供丰富的信息。在实际应用中,你可以根据需要调整颜色、纹理、字体等参数,以满足不同的可视化需求。
到此这篇关于使用python绘制带填充纹理的堆叠图的文章就介绍到这了,更多相关python绘制堆叠图内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论