一、前言
前面我详细介绍了如何绘制漂亮的折线图:
【Python可视化系列】一文彻底教会你绘制美观的折线图(理论+源码)
本篇文章将教你绘制美观的柱状图。柱状图(Bar Chart)是一种常用的统计图表,用于展示不同类别或组之间的比较。它通过使用矩形的长度来表示数据的大小或数量。
在柱状图中,每个类别或组通常在水平轴(X轴)上被表示为独立的条形,而数据的值则在垂直轴(Y轴)上表示。条形的高度对应于数据的数值大小,从而可以直观地比较不同类别或组之间的差异。
绘制柱状图的工具和库有很多,例如Python中的Matplotlib、Seaborn和Plotly等。这些库提供了丰富的函数和方法,使得绘制柱状图变得简单而灵活。
我将持续更新可视化的一些方法,关注我,不错过!本文将详细解读绘制柱状图的要点!
plt.bar()参数详解
plt.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
x → 为一个标量序列,确定x轴刻度数目
height → 确定y轴的刻度
width → 单个直方图的宽度
bottom → 设置y边界坐标轴起点
color → 设置直方图颜色(只给出一个值表示全部使用该颜色,若赋值颜色列表则会逐一染色,若给出颜色列表数目少于直方图数目则会循环利用)
其他的一些参数:
align:柱状图的中心位置,默认"center"居中,可设置为"lege"边缘;
edgecolor:边框颜色;
linewidth:边框宽度;
tick_label:下标标签;
log:柱状图y周使用科学计算方法,bool类型;
orientation:柱状图是竖直还是水平,竖直:“vertical”,水平条:“horizontal”;
二、基本柱状图
import matplotlib.pyplot as plt
import seaborn as sns
# 设置绘图风格
# 法1:
# sns.set(style='darkgrid', font_scale=1.2)
# 法2:
plt.style.use('seaborn-darkgrid')
# 设置字体,中文为SimSun,英文为Times New Roman
# 法1:
plt.rcParams['font.family'] = 'Times New Roman, SimSun'
# 法2:
# font1 = {'family': 'Times New Roman, SimSun'}
# plt.rc('font', **font1)
# 法3:
# config = {
# "font.family": 'Times New Roman, SimSun', # 衬线字体
# "font.size": 12, # 相当于小四大小
# "mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大
# 'axes.unicode_minus': False # 处理负号,即-号
# }
# plt.rcParams.update(config)
# 数据
x = ['A', 'B', 'C', 'D']
y = [10, 20, 15, 25]
# 绘制柱状图
plt.bar(x, y)
# 添加标题和标签
plt.title('柱状图示例',fontsize=16)
plt.xlabel('类别',fontsize=16)
plt.ylabel('数值',fontsize=16)
# 显示图形
plt.show()
效果如下:
三、同一个x轴位置绘制多个柱状图
from matplotlib import pyplot as plt
import numpy as np
# 参数设置
plt.style.use('seaborn-darkgrid')
plt.rcParams['font.family'] = 'Times New Roman, SimSun'
# 数据
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = [16, 12, 9, 8, 8]
silver_medal = [8, 10, 4, 10, 5]
bronze_medal = [13, 5, 2, 7, 5]
# 将横坐标国家先替换为数值
x = np.arange(len(countries))
width = 0.2
gold_x = x
silver_x = x + width
bronze_x = x + 2 * width
# 绘图
plt.bar(gold_x, gold_medal, width=width, color='gold', label='金牌')
plt.bar(silver_x,silver_medal,width=width,color="silver",label="银牌")
plt.bar(bronze_x,bronze_medal,width=width, color="saddlebrown",label="铜牌")
#将横坐标数值转换为国家
plt.xticks(x + width, labels=countries)
#显示柱状图的高度文本
for i in range(len(countries)):
plt.text(gold_x[i],gold_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(silver_x[i],silver_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
plt.text(bronze_x[i],bronze_medal[i], gold_medal[i],va="bottom",ha="center",fontsize=8)
#显示图例
plt.legend(loc="upper right")
plt.show()
同一个x轴绘制多个柱状图重点在于需要设置x这个参数,即确定好x轴刻度的位置,效果如下:
四、叠堆柱状图
from matplotlib import pyplot as plt
import numpy as np
# 参数设置
plt.style.use('seaborn-darkgrid')
plt.rcParams['font.family'] = 'Times New Roman, SimSun'
# 数据
countries = ['挪威', '德国', '中国', '美国', '瑞典']
gold_medal = np.array([16, 12, 9, 8, 8])
silver_medal = np.array([8, 10, 4, 10, 5])
bronze_medal = np.array([13, 5, 2, 7, 5])
width = 0.3
#绘图
plt.bar(countries, gold_medal, color='gold', label='金牌',bottom=silver_medal + bronze_medal,width=width)
plt.bar(countries, silver_medal, color='silver', label='银牌', bottom=bronze_medal,width=width)
plt.bar(countries, bronze_medal, color='#A0522D', label='铜牌',width=width)
#设置y轴标签,图例和文本值
plt.ylabel('奖牌数')
plt.legend(loc='upper right')
for i in range(len(countries)):
max_y = bronze_medal[i]+silver_medal[i]+gold_medal[i]
plt.text(countries[i], max_y, max_y, va="bottom", ha="center")
plt.show()
堆叠柱状图重点在于设置bottom这个参数,效果如下:
好了,本篇内容就到这里,需要源码的小伙伴可以关注我!
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。