【如何用python 画带有表格数据的堆叠柱状图】

本文介绍了如何使用Python中的pandas和matplotlib库,通过读取Excel数据、整理清洗、堆叠柱状图和添加表格,实现一张包含详细数据的图表。
部署运行你感兴趣的模型镜像

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

如何用python 画带有表格数据的堆叠柱状图


提示:以下是本篇文章正文内容,下面案例可供参考

一、大致思路

0.读取数据并整理与清洗
1.堆叠柱状图,堆叠选用累积for 函数画图
2.表格数据,选用plt.table展示
3.柱状图何表格的位置摆放

二、实现代码

1.数据

不同灾难随着时间损失数

2.代码

代码如下(示例):

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
dt=pd.read_excel('disaster.xlsx',index_col=0)
data=dt.values[::-1,:]#行倒叙翻转 ,方便y轴从下到上,数值由小变大画图

f=plt.figure(dpi=200)
ax=f.subplots()
columns=dt.columns#列名,五个灾难
rows=dt.index#行名,Index(['100year', '50year', '20year', '10year', '5year'], dtype='object', name='loss by disater')
color=plt.cm.PuBuGn(np.linspace(.2,.9,len(rows)))
index=np.arange(len(columns))+.3 #五个灾难为05,再+.3,作为x坐标轴位置,array([0.3, 1.3, 2.3, 3.3, 4.3])
bar_width=.4#0.3+0.4+0.3=1,即柱状图宽度为0.4且在x轴0.3的位置开始画图,让柱状图在中间位置
y_offset=np.zeros(len(columns))#y轴第一个柱状图起始位置都为0,对应五个列名为五个0
cell_text=[]#生成一个用于累加y轴堆叠数值的列表
for i in range(data.shape[0]): #data.shape[0]data第一个对象的数量,代指这里五个灾难
    ax.bar(index,data[i],bar_width,color=color[i],bottom=y_offset)#(x轴位置,每个灾难对应的数值,柱宽,柱子颜色,y轴柱状图起始位置)
    y_offset=y_offset+data[i]#画堆叠柱状图
    cell_text.append(['{:.1f}'.format(x) for x in y_offset])#保存堆叠柱状图对应的y轴数值

cell_text.reverse()#y轴数值翻转,匹配柱状图
colors_reverse=color[::-1,:]#颜色翻转,匹配柱状图

#画表格函数ax.table(表格内容,行标签,列标签,每行对应的颜色,表格放置的位置)
ax.table(cellText=cell_text,rowLabels=rows,colLabels=columns,rowColours=colors_reverse,loc='bottom')
plt.xticks([])
plt.ylabel('loss')
plt.title('loss by disaster')
plt.savefig('带有表格的柱状图.png', bbox_inches='tight')#tight避免出现保存图片不完整情形
plt.show()

3.图片展示

在这里插入图片描述


总结

数据读取的方式,堆叠图画法的思路,颜色细节的调整,即可画出一张在excel上能轻松画出带有表格数据的柱状图,哈哈哈哈哈

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们之前讨论了如何设置标题和标题样式,现在用户想了解如何向图表中添加数据。在Matplotlib中,向图表添加数据主要通过绘图函数实现,例如绘制折线图、散点图、柱状图等。下面将详细介绍几种常见的方法。 ### 1. 添加单组数据 使用`plot`函数添加一组数据(折线图): ```python import matplotlib.pyplot as plt import numpy as np # 创建数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 创建图表并添加数据 plt.figure(figsize=(8, 5)) plt.plot(x, y, label='正弦曲线') # 添加一组数据[^1] # 设置标题、标签等 plt.title('正弦函数', fontsize=14) plt.xlabel('x轴', fontsize=12) plt.ylabel('y轴', fontsize=12) plt.legend() plt.show() ``` ### 2. 添加多组数据 在同一图表中添加多组数据(例如多条折线): ```python plt.figure(figsize=(8, 5)) # 添加第一组数据 plt.plot(x, np.sin(x), label='sin(x)', color='blue') # 添加第二组数据 plt.plot(x, np.cos(x), label='cos(x)', color='red', linestyle='--') plt.title('三角函数对比', fontsize=14) plt.legend() plt.show() ``` ### 3. 添加散点数据 使用`scatter`函数添加散点数据: ```python # 生成随机散点数据 np.random.seed(0) x_rand = np.random.rand(50) * 10 y_rand = np.random.rand(50) * 10 plt.figure(figsize=(8, 5)) plt.scatter(x_rand, y_rand, color='green', label='随机点') # 添加散点数据[^3] plt.title('随机散点图', fontsize=14) plt.legend() plt.show() ``` ### 4. 添加柱状图数据 使用`bar`函数添加柱状图数据: ```python # 柱状图数据 categories = ['A', 'B', 'C', 'D'] values = [25, 40, 30, 45] plt.figure(figsize=(8, 5)) plt.bar(categories, values, color='skyblue', label='数量') # 添加柱状图数据[^5] plt.title('柱状图示例', fontsize=14) plt.legend() plt.show() ``` ### 5. 添加自定义数据标记 在折线图中突出显示特定数据点: ```python plt.figure(figsize=(8, 5)) # 绘制正弦曲线 plt.plot(x, y, 'b-', label='正弦曲线') # 添加特定数据点标记 highlight_x = [0, np.pi, 2*np.pi, 3*np.pi] highlight_y = np.sin(highlight_x) plt.scatter(highlight_x, highlight_y, color='red', s=80, label='关键点', zorder=5) # s为点大小 plt.title('正弦函数关键点标记', fontsize=14) plt.legend() plt.show() ``` ### 6. 添加填充数据(面积图) 使用`fill_between`填充两条曲线之间的区域: ```python plt.figure(figsize=(8, 5)) # 绘制两条曲线 plt.plot(x, np.sin(x), 'b', label='sin(x)') plt.plot(x, np.cos(x), 'r', label='cos(x)') # 填充两条曲线之间的区域 plt.fill_between(x, np.sin(x), np.cos(x), where=(np.sin(x) > np.cos(x)), color='green', alpha=0.3, label='sin>cos区域') # 条件填充[^5] plt.title('曲线间填充', fontsize=14) plt.legend() plt.show() ``` ### 7. 添加误差线 使用`errorbar`添加带误差线的数据: ```python # 实验数据 x_exp = np.arange(1, 6) y_exp = [10, 15, 17, 14, 12] y_err = [1, 1.5, 2, 1.2, 0.8] plt.figure(figsize=(8, 5)) plt.errorbar(x_exp, y_exp, yerr=y_err, fmt='o', capsize=5, label='实验数据') # 添加误差线[^3] plt.title('实验数据误差图', fontsize=14) plt.legend() plt.show() ``` ### 8. 添加文本注释 使用`text`或`annotate`在特定位置添加文本说明: ```python plt.figure(figsize=(8, 5)) plt.plot(x, y) # 在特定点添加文本 plt.text(5, 0, '零点(5,0)', fontsize=12, color='purple') # 在坐标(5,0)处添加文本 # 使用箭头标注特殊点 plt.annotate('最大值点', xy=(np.pi/2, 1), xytext=(3, 0.8), arrowprops=dict(facecolor='black', arrowstyle='->'), fontsize=12) plt.title('添加文本注释', fontsize=14) plt.show() ``` ### 9. 添加图例 虽然图例不是直接的数据,但它是标识数据系列的重要元素: ```python plt.figure(figsize=(8, 5)) line1, = plt.plot(x, np.sin(x), label='sin(x)') line2, = plt.plot(x, np.cos(x), label='cos(x)') # 手动创建图例 plt.legend(handles=[line1, line2], loc='upper right') # 添加图例[^1] plt.title('三角函数图例', fontsize=14) plt.show() ``` ### 10. 添加数据表格 在图表下方添加数据表格: ```python fig, ax = plt.subplots(figsize=(8, 5)) # 绘制柱状图 ax.bar(categories, values, color='skyblue') # 添加表格 table_data = [['类别', '值']] + [[cat, val] for cat, val in zip(categories, values)] ax.table(cellText=table_data, loc='bottom', cellLoc='center') # 调整布局避免重叠 plt.subplots_adjust(bottom=0.2) # 为表格留出空间 ax.set_title('带数据表格柱状图', fontsize=14) ax.legend(['数据系列']) plt.show() ``` ### 关键技巧总结: 1. **选择正确的绘图函数**: - 折线图:`plot()` - 散点图:`scatter()` - 柱状图:`bar()`(垂直)或`barh()`(水平) - 饼图:`pie()` - 直方图:`hist()` - 箱线图:`boxplot()` 2. **数据标记与样式**: - `color`:控制颜色 - `linestyle`:线型(实线、虚线等) - `marker`:数据点标记形状 - `alpha`:透明度 3. **高级数据表示**: - 误差线:`errorbar()` - 填充区域:`fill_between()` - 堆叠图:`stackplot()`(见引用[5]) 4. **数据标注**: - `text()`:简单文本 - `annotate()`:带箭头的注释 > 注意:添加数据后务必设置清晰的标题、坐标轴标签和图例,确保图表可读性[^1][^3]。 §§相关问题§§ 1. 如何在 Matplotlib 中自定义图例样式和位置? 2. Matplotlib 中如何绘制双Y轴图表? 3. 如何将 Matplotlib 图表导出为高质量图片?</think>在 Python 中使用 Matplotlib 向图表添加数据有多种方法,以下是详细指南: ### 1. 基础数据添加方法 ```python import matplotlib.pyplot as plt import numpy as np # 创建基础数据 x = np.linspace(0, 10, 100) y = np.sin(x) # 创建图表并添加数据 plt.figure(figsize=(10, 6)) plt.plot(x, y) # 添加折线图数据[^1] # 添加散点数据示例 x_points = np.array([1, 3, 5, 7, 9]) y_points = np.array([0.5, 0.8, -0.2, 0.6, -0.5]) plt.scatter(x_points, y_points, color='red', s=80) # 添加散点数据[^3] plt.title('基础数据添加示例') plt.show() ``` ### 2. 多数据集添加方法 ```python plt.figure(figsize=(10, 6)) # 添加多组折线数据 plt.plot(x, np.sin(x), label='正弦曲线', color='blue') plt.plot(x, np.cos(x), label='余弦曲线', color='red', linestyle='--') # 添加柱状图数据 categories = ['A', 'B', 'C', 'D'] values = [25, 40, 30, 45] plt.bar(categories, values, alpha=0.5, label='柱状数据') # 添加柱状图数据[^5] plt.legend() plt.title('多类型数据添加') plt.show() ``` ### 3. 动态数据添加方法 ```python fig, ax = plt.subplots(figsize=(10, 6)) # 初始数据 x_data = [] y_data = [] # 动态添加数据点 for i in range(10): x_data.append(i) y_data.append(np.sin(i)) ax.clear() # 清除当前轴 ax.plot(x_data, y_data, 'bo-') # 添加新数据点 ax.set_title(f'动态添加数据点 (第 {i+1} 个点)') plt.pause(0.5) # 暂停0.5秒 plt.show() ``` ### 4. 高级数据添加技巧 ```python plt.figure(figsize=(10, 6)) # 添加误差线数据 x = [1, 2, 3, 4, 5] y = [10, 15, 12, 18, 16] y_err = [1, 1.5, 0.8, 2, 1.2] plt.errorbar(x, y, yerr=y_err, fmt='o', capsize=5, label='带误差数据') # 添加误差线数据[^3] # 添加填充区域数据 x_fill = np.linspace(0, 10, 100) y1 = np.sin(x_fill) y2 = np.cos(x_fill) plt.fill_between(x_fill, y1, y2, alpha=0.3, label='填充区域') # 添加填充区域数据[^5] # 添加文本标注 plt.annotate('关键点', xy=(5, 0), xytext=(6, 0.5), arrowprops=dict(facecolor='black', arrowstyle='->'), fontsize=12) plt.legend() plt.title('高级数据添加技术') plt.show() ``` ### 5. 从外部数据源添加数据 ```python import pandas as pd # 从CSV文件加载数据 data = pd.read_csv('data.csv') # 假设有日期和销售额两列 plt.figure(figsize=(12, 6)) # 添加时间序列数据 plt.plot(data['日期'], data['销售额'], marker='o', label='日销售额') # 添加移动平均线 moving_avg = data['销售额'].rolling(window=7).mean() plt.plot(data['日期'], moving_avg, color='red', linewidth=2, label='7日移动平均') plt.title('从外部数据源添加数据') plt.legend() plt.xticks(rotation=45) plt.tight_layout() plt.show() ``` ### 6. 数据添加最佳实践 ```python fig, axs = plt.subplots(2, 1, figsize=(10, 8)) # 子图1:添加堆叠面积图数据 x = np.arange(1, 10) y1 = np.array([866, 2335, 5710, 6482, 6120, 1605, 3813, 4428, 4631]) y2 = np.array([433, 1167, 2855, 3241, 1060, 802, 1906, 2214, 3515]) axs[0].stackplot(x, y1, y2, labels=['注册人数', '激活人数']) # 添加堆叠数据[^5] axs[0].set_title('堆叠面积图数据') axs[0].legend() # 子图2:添加箱线图数据 data_to_plot = [np.random.normal(0, std, 100) for std in range(1, 4)] axs[1].boxplot(data_to_plot, labels=['数据集1', '数据集2', '数据集3']) # 添加箱线图数据 axs[1].set_title('箱线图数据') plt.tight_layout() plt.show() ``` ### 关键方法总结: 1. **基础绘图函数**: - `plot()` - 添加折线图数据 - `scatter()` - 添加散点图数据 - `bar()` - 添加柱状图数据 - `hist()` - 添加直方图数据 2. **高级数据添加**: - `errorbar()` - 添加带误差线的数据 - `fill_between()` - 添加填充区域数据 - `stackplot()` - 添加堆叠面积图数据 - `boxplot()` - 添加箱线图数据 3. **动态数据更新**: - 使用循环逐步添加数据点 - 结合`FuncAnimation`实现动效果 4. **外部数据集成**: - 从Pandas DataFrame添加数据 - 从CSV/Excel文件导入数据 > 提示:添加数据后,使用`plt.legend()`添加图例说明数据系列,使用`plt.xlabel()`和`plt.ylabel()`标注坐标轴,使图表更易理解[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值