目录
单一柱状图
分组柱状图
堆积柱状图
百分比柱状图
均值柱状图
不等宽柱状图
有序柱状图
条形图
发散条形图
在条上添加标签的发散条形图
基础棒棒糖图1
基础棒棒糖图2
【声明】:未经版权人书面许可,任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博客的全部或部分内容,也不得在未经版权人授权的情况下将本博客用于任何商业目的。但版权人允许个人学习、研究、欣赏等非商业性用途的复制和传播。非常推荐大家学习《Python数据可视化科技图表绘制》这本书籍。
单一柱状图
import pandas as pd # 导入pandas库并简写为pd
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块并简写为plt# 自定义数据集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8]}) # 创建一个包含类别和值的DataFrame
# 查看数据结构
print("数据结构:")
print(data)# 创建单一柱状图
plt.figure(figsize=(6, 4)) # 创建图形对象,并设置图形大小
plt.bar(data['category'], data['value'], color='steelblue')
# 绘制柱状图,指定x轴为类别,y轴为值,柱状颜色为钢蓝色
plt.xlabel('Category') # 设置x轴标签
plt.ylabel('Value') # 设置y轴标签
plt.title('Single Bar Chart') # 设置图表标题# 添加网格线,采用虚线,设置为灰色,透明度为0.5
plt.grid(linestyle='-', color='gray', alpha=0.5)# 保存图片
plt.savefig('P93单一柱状图.png', dpi=600, transparent=True)
plt.show()

分组柱状图
import pandas as pd # 导入pandas库并简写为pd
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块并简写为plt# 自定义一个包含多列数据的数据框DataFrame,包含类别和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})
# 查看数据框
print("Data Structure:")
print(data) # 输出如图43所示# 创建分组柱状图
data.plot(x='category', kind='bar', figsize=(6, 4))
# 使用DataFrame的plot方法绘制分组柱状图
# 指定x轴为'category'列,图表类型为'bar',图形大小为(6,4)
plt.xlabel('Category') # 设置x轴标签
plt.xticks(rotation=0) # 旋转x轴文本,使其水平显示
plt.ylabel('Value') # 设置y轴标签
plt.title('Grouped Bar Chart') # 设置图表标题
plt.legend(title='Values') # 添加图例,并设置标题为'Values'# 保存图片
plt.savefig('P94分组柱状图.png', dpi=600, transparent=True)
plt.show()

堆积柱状图
import pandas as pd
import matplotlib.pyplot as plt# 自定义一个包含多列数据的数据框DataFrame,包含类别和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})# 查看数据框
print("Data Structure:")
print(data)# 将'category' 列设置为索引,并创建堆积柱状图
data.set_index('category').plot(kind='bar', stacked=True, figsize=(6, 4))
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Stacked Bar Chart')
plt.xticks(rotation=0)# 添加图例,并设置标题为'Values',并放置在图的右侧
plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5))# 保存图片时自动调整边界
plt.savefig('P95堆积柱状图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

百分比柱状图
import pandas as pd # 导入pandas库并简写为pd
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块并简写为plt# 自定义一个包含多列数据的数据框DataFrame,包含类别和多列值
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value1': [10, 15, 7, 12, 8], 'value2': [6, 9, 5, 8, 4],'value3': [3, 5, 2, 4, 6], 'value4': [9, 6, 8, 3, 5]})
# 查看数据框
print("Data Structure:")
print(data) # 输出如图43所示# 创建百分比柱状状图
# 复制数据集到新的DataFrame以便进行百分比计算
data_percentage = data.copy()# 计算每个数值列的百分比,除以每行的总和并乘以100
data_percentage.iloc[:, 1:] = data_percentage.iloc[:, 1:].div(data_percentage.iloc[:, 1:].sum(axis=1), axis=0) * 100data_percentage.set_index('category').plot(kind='bar',stacked=True, figsize=(6, 4))
# 创建百分比堆叠柱状图,设置索引为'category'列,
# 图表类型为'bar',堆积模式为True,图形大小为(6,4)plt.xlabel('Category') # 设置x轴标签
plt.ylabel('Percentage') # 设置y轴标签
plt.title('Percentage Stacked Bar Chart') # 设置图表标题
plt.xticks(rotation=0) # 旋转x轴文本,使其水平显示# 添加图例,并设置标题为'Values',并放置在图的右侧
plt.legend(title='Values', loc='center left', bbox_to_anchor=(1, 0.5))# 保存图片时自动调整边界
plt.savefig('P97百分比柱状图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

均值柱状图
import pandas as pd # 导入pandas库并简写为pd
import matplotlib.pyplot as plt # 导入matplotlib.pyplot模块并简写为plt
import seaborn as sns # 导入seaborn库并简写为sns# 创建创建一个包含类别、值和标准差的DataFrame数据集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8], 'std': [1, 2, 1.5, 1.2, 2.5]})# 计算每个类别的均值和标准差
mean_values = data['value']
std_values = data['std']colors = sns.color_palette("Set1", n_colors=len(data)) # 创建颜色调色板
# 创建均值柱状图
plt.figure(figsize=(6, 4)) # 创建图形对象,并设置图形大小
bars = plt.bar(data['category'], mean_values, color=colors)
# 绘制柱状图,指定x轴为类别,y轴为均值,柱状颜色为颜色调色板中的颜色# 添加误差线
for i, (bar, std) in enumerate(zip(bars, std_values)):plt.errorbar(bar.get_x() + bar.get_width() / 2, bar.get_height(),# 在柱状图的中心位置添加误差线yerr=std, fmt='none', color='black', ecolor='gray',# 设置误差线的样式和颜色capsize=5, capthick=2) # 设置误差线的帽子大小和线宽
# 添加标题和标签
plt.xlabel('Category') # 设置x轴标签
plt.ylabel('Mean Value') # 设置y轴标签
plt.title('Mean Bar Chart with Error Bars') # 设置图表标题# 设置网格线的样式、颜色和透明度
plt.grid(axis='both', linestyle='-', color='gray', alpha=0.5)# 保存图片时自动调整边界
plt.savefig('P98均值柱状图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

不等宽柱状图
import pandas as pd
import matplotlib.pyplot as plt# 创建数据集
data = pd.DataFrame({'category': ["A", "B", "C", "D", "E"],'value': [10, 15, 7, 12, 8],'width': [0.8, 0.4, 1.0, 0.5, 0.9]})
print("数据结构:"), print(data) # 查看数据框,如图48所示# 自定义颜色列表,每个柱子使用不同的配色
colors = ['red', 'green', 'blue', 'orange', 'purple']
# 创建不等宽柱状图
plt.figure(figsize=(6, 4))
for i in range(len(data)):plt.bar(data['category'][i], data['value'][i],width=data['width'][i], color=colors[i])# 添加标题和标签
plt.xlabel('Category')
plt.ylabel('Value')
plt.title('Unequal Width Bar Chart')# 设置网格线
plt.grid(axis='both', linestyle='-', color='gray', alpha=0.5)# 保存图片时自动调整边界
plt.savefig('P99不等宽柱状图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

有序柱状图
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.patches as patchesdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\mpg_ggplot2.csv") # 读取原始数据
# 按制造商分组,并计算每个制造商的平均城市里程
df = df_raw[['cty', 'manufacturer']].groupby('manufacturer').apply(lambda x: x.mean())# 按城市里程排序数据
df.sort_values('cty', inplace=True) # 按城市里程排序数据
df.reset_index(inplace=True) # 重置索引# 绘图
# 创建图形和坐标轴对象
fig, ax = plt.subplots(figsize=(10, 6), facecolor='white', dpi=80)# 使用vlines绘制垂直线条,代表城市里程
ax.vlines(x=df.index, ymin=0, ymax=df.cty, color='firebrick',alpha=0.7, linewidth=20)# 添加文本注释
# 在每个条形的顶部添加数值标签
for i, cty in enumerate(df.cty):ax.text(i, cty + 0.5, round(cty, 1), horizontalalignment='center')# 设置标题、标签、刻度和y轴范围
ax.set_title('Bar Chart for Highway Mileage',fontdict={'size': 18}) # 设置标题
ax.set(ylabel='Miles Per Gallon', ylim=(0, 30)) # 设置y轴标签和范围
plt.xticks(df.index, df.manufacturer.str.upper(), rotation=60,horizontalalignment='right', fontsize=8) # 设置x轴标签# 添加补丁以为X轴标签着色
# 创建两个补丁对象,用于着色X轴标签的背景
p1 = patches.Rectangle((.57, -0.005), width=.33, height=.13, alpha=.1,facecolor='green', transform=fig.transFigure) # 创建绿色补丁
p2 = patches.Rectangle((.124, -0.005), width=.446, height=.13, alpha=.1,facecolor='red', transform=fig.transFigure) # 创建红色补丁
# 将补丁对象添加到图形上
fig.add_artist(p1) # 添加绿色补丁
fig.add_artist(p2) # 添加红色补丁# 保存图片时自动调整边界
plt.savefig('P100有序柱状图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

条形图
import pandas as pd
import matplotlib.pyplot as plt
import randomdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\mpg_ggplot2.csv") # 导入数据
# 准备数据
df = df_raw.groupby('manufacturer').size().reset_index(name='counts')
# 按制造商分组并计算每个制造商的数量
n = df['manufacturer'].unique().__len__() + 1 # 获取唯一制造商的数量
all_colors = list(plt.cm.colors.cnames.keys()) # 获取所有可用的颜色
random.seed(100) # 设置随机种子,确保每次运行生成的颜色相同
c = random.choices(all_colors, k=n) # 从颜色列表中随机选择 n 个颜色# 绘制条形图
plt.figure(figsize=(10, 6), dpi=80) # 设置图形大小
plt.barh(df['manufacturer'], df['counts'], color=c,height=.5) # 绘制水平条形图,X轴为counts,Y轴为manufacturer
for i, val in enumerate(df['counts'].values): # 遍历每个条形并在右侧添加数值标签plt.text(val, i, float(val), horizontalalignment='left',verticalalignment='center', fontdict={'fontweight': 500, 'size': 12})# 添加修饰
plt.gca().invert_yaxis() # 反转Y轴,确保顺序正确显示
plt.title("Number of Vehicles by Manufacturers",fontsize=18) # 设置标题和字体大小
plt.xlabel('# Vehicles') # 设置x轴标签
plt.xlim(0, 45) # 设置x轴的范围# 保存图片时自动调整边界
plt.savefig('P103条形图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

发散条形图
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\mtcars1.csv") # 读取数据# 提取'mpg'列作为x变量,并计算其标准化值
x = df.loc[:, ['mpg']]
df['mpg_z'] = (x - x.mean()) / x.std()
# 根据'mpg_z'列的值确定颜色
df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]df.sort_values('mpg_z', inplace=True) # 根据'mpg_z'列的值对数据进行排序
df.reset_index(inplace=True) # 重置索引# 绘制图形 ①
plt.figure(figsize=(10, 8), dpi=600)
plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z, color=df.colors,alpha=0.4, linewidth=5)# 图形修饰
plt.gca().set(ylabel='$Model$', xlabel='$Mileage$') # 设置y轴和x轴标签
plt.yticks(df.index, df.cars, fontsize=12) # 设置y轴刻度标签和字体大小
plt.title('Diverging Bars of Car Mileage',fontdict={'size': 20}) # 设置标题和字体大小
plt.grid(linestyle='--', alpha=0.5) # 添加网格线# 保存图片时自动调整边界
plt.savefig('P104发散条形图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

在条上添加标签的发散条形图
import pandas as pd
import matplotlib.pyplot as pltdf = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\mtcars1.csv") # 读取数据# 提取'mpg'列作为x变量,并计算其标准化值
x = df.loc[:, ['mpg']]
df['mpg_z'] = (x - x.mean()) / x.std()
# 根据'mpg_z'列的值确定颜色
df['colors'] = ['red' if x < 0 else 'green' for x in df['mpg_z']]df.sort_values('mpg_z', inplace=True) # 根据'mpg_z'列的值对数据进行排序
df.reset_index(inplace=True) # 重置索引plt.figure(figsize=(10, 8), dpi=600)
plt.hlines(y=df.index, xmin=0, xmax=df.mpg_z)# 在条形上添加标签
for x, y, tex in zip(df.mpg_z, df.index, df.mpg_z):t = plt.text(x, y, round(tex, 2),horizontalalignment='right' if x < 0 else 'left',verticalalignment='center',fontdict={'color': 'red' if x < 0 else 'green', 'size': 12})# 图形修饰
plt.gca().set(ylabel='$Model$', xlabel='$Mileage$') # 设置y轴和x轴标签
plt.yticks(df.index, df.cars, fontsize=12) # 设置y轴刻度标签和字体大小
plt.title('Diverging Bars of Car Mileage',fontdict={'size': 20}) # 设置标题和字体大小
plt.grid(linestyle='--', alpha=0.5) # 添加网格线
plt.xlim(-2.5, 2.5) # 设置x轴范围# 保存图片时自动调整边界
plt.savefig('P105在条上添加标签的发散条形图.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

基础棒棒糖图1
import matplotlib.pyplot as plt
import numpy as np# 创建数据
np.random.seed(19781101) # 固定随机种子,以便结果可复现
values = np.random.uniform(size=40) # 生成40个0到1之间的随机数
positions = np.arange(len(values)) # 生成与values长度相同的位置数组plt.figure(figsize=(10, 6)) # 创建图形窗口大小# 绘制没有标记的图形
plt.subplot(2, 2, 1) # 创建一个2x2的子图矩阵,并选择第1个子图
plt.stem(values, markerfmt=' ') # 绘制棒棒糖图,没有标记
plt.title("No Markers") # 设置子图标题# 改变颜色、形状、大小和边缘
plt.subplot(2, 2, 2) # 选择第2个子图
(markers, stemlines, baseline) = plt.stem(values) # 获取棒棒糖图的组件
plt.setp(markers, marker='D', markersize=6,markeredgecolor="orange", markeredgewidth=2) # 设置标记属性
plt.title("Custom Markers") # 设置子图标题# 绘制没有标记的图形(水平展示)
plt.subplot(2, 2, 3) # 选择第3个子图
plt.hlines(y=positions, xmin=0, xmax=values, color='skyblue') # 绘制水平线
plt.plot(values, positions, ' ') # 绘制数据点
plt.title("Horizontal No Markers") # 设置子图标题# 改变颜色、形状、大小和边缘进行水平展示
plt.subplot(2, 2, 4) # 选择第4个子图
plt.hlines(y=positions, xmin=0, xmax=values, color='skyblue') # 绘制水平线
plt.plot(values, positions, 'D', markersize=6,markeredgecolor="orange", markerfacecolor="orange",markeredgewidth=2) # 绘制数据点,并设置属性
plt.title("Horizontal Custom Markers") # 设置子图标题plt.tight_layout() # 自动调整子图布局# 保存图片时自动调整边界
plt.savefig('P107基础棒棒糖图1.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()

基础棒棒糖图2
import pandas as pd
import matplotlib.pyplot as pltdf_raw = pd.read_csv(r"E:\PythonProjects\experiments_figures\绘图案例数据\mpg_ggplot2.csv") # 读取原始数据
# 按制造商分组,并计算每个制造商的平均城市里程
df = df_raw[['cty', 'manufacturer']].groupby('manufacturer').apply(lambda x: x.mean())# 按城市里程排序数据
df.sort_values('cty', inplace=True)
df.reset_index(inplace=True)# 绘图
fig, ax = plt.subplots(figsize=(12, 8), dpi=80)# 使用vlines绘制垂直线条,代表城市里程的起始点
ax.vlines(x=df.index, ymin=0, ymax=df.cty, color='firebrick',alpha=0.7, linewidth=2)# 使用scatter绘制lollipop的圆点
ax.scatter(x=df.index, y=df.cty, s=75, color='firebrick', alpha=0.7)# 设置标题、标签、刻度和y轴范围
ax.set_title('Lollipop Chart for Highway Mileage',fontdict={'size': 20}) # 设置标题
ax.set_ylabel('Miles Per Gallon') # 设置y轴标签
ax.set_xticks(df.index) # 设置x轴刻度位置
ax.set_xticklabels(df.manufacturer.str.upper(), rotation=60,fontdict={'horizontalalignment': 'right', 'size': 12}) # 设置x轴刻度标签
ax.set_ylim(0, 30) # 设置y轴范围# 添加注释
# 使用for循环遍历DataFrame的每一行,并在每个lollipop的顶部添加城市里程的数值
for row in df.itertuples():ax.text(row.Index, row.cty + 0.5, s=round(row.cty, 2),horizontalalignment='center', verticalalignment='bottom',fontsize=14)# 保存图片时自动调整边界
plt.savefig('P107基础棒棒糖图2.png', dpi=600, bbox_inches='tight', transparent=True)
plt.show()
