绘图前的准备

因为涉及到中文显示,所以需要用两行代码解决中文乱码问题

import numpy as np
from matplotlib import pyplot as plt

plt.rcParams['font.sans-serif'] = [u'SimHei'] # SimHei就是中文字体
# 因为设置了中文后,负号就乱码了,所以还要设置负号的编码
plt.rcParams['axes.unicode_minus'] = False # 修改坐标轴中符号的编码
# 设置图片尺寸和分辨率
plt.figure(figsize=(10,8),dpi=100) # 1000*800 像素

1、竖放单条形图

准备数据

# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 国家的序号0-4
country_num = np.arange(len(countries))
# 金牌数
gold_num = np.array([16,12,9,8,8])

绘制图形并显示

# 绘制柱状图
plt.bar(countries,gold_num,width=0.3,color='gold')
# 设置坐标轴标签
plt.xlabel('国家', fontsize=14,loc='right')
plt.ylabel('奖牌数', fontsize=14,loc='top')
# 设置图形标题
plt.title('冬奥会各个国家所获奖牌数',fontsize=18)
# 设置x轴刻度
plt.xticks(country_num,countries,fontsize=14)
# 给每一个柱体添加数据显示
for i in country_num:
    plt.text(country_num[i], gold_num[i], gold_num[i], 
             fontdict=dict(fontsize=14),va='bottom',ha='center')

plt.show()

Python绘制多种形式的条形图(柱状图)_图例

2、竖放多条形图

如果要同时绘制金银铜牌的数量图,可以使用多条形图绘制 准备数据

# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 国家的序号0-4
country_num = np.arange(len(countries))
# 金牌数
gold_num = np.array([16,12,9,8,8])
# 银牌数
silver_num = np.array([8,10,4,10,5])
# 铜牌数
bronze_num = np.array([13,5,2,7,5])

绘制图形并展示

# 设置每个条形的宽度
width = 0.2
# 银牌在x轴刻度的起始位置
silver_start = country_num
# 金牌在x轴刻度的起始位置
gold_start = country_num + width
# 铜牌在x轴刻度的起始位置
bronze_start = country_num + width*2

# 加上label标签,为设置图例使用
plt.bar(silver_start, silver_num, width=width,color='silver',label='银牌')
plt.bar(gold_start, gold_num, width=width,color='gold',label='金牌')
plt.bar(bronze_start, bronze_num, width=width,color='#4c300a',label='铜牌')
plt.xlabel('国家', fontsize=14,loc='right')
plt.ylabel('奖牌数', fontsize=14,loc='top')
plt.title('冬奥会各个国家所获奖牌数',fontsize=18)
# 为了让国家名称在三个柱状的中间,需要改变xticks
plt.xticks(gold_start,countries,fontsize=14)
# 设置图例
plt.legend()
for i in country_num:
    plt.text(gold_start[i], gold_num[i], gold_num[i], 
              fontdict=dict(fontsize=14),va='bottom',ha='center')
    plt.text(silver_start[i], silver_num[i], silver_num[i], 
              fontdict=dict(fontsize=14),va='bottom',ha='center')
    plt.text(bronze_start[i], bronze_num[i], bronze_num[i], 
              fontdict=dict(fontsize=14),va='bottom',ha='center')
plt.show()

Python绘制多种形式的条形图(柱状图)_绘制图形_02

3、堆叠条形图

如果要同时直观展示奖牌总数,可以使用堆叠柱状图 准备数据

# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 国家的序号0-4
country_num = np.arange(len(countries))
# 金牌数
gold_num = np.array([16,12,9,8,8])
# 银牌数
silver_num = np.array([8,10,4,10,5])
# 铜牌数
bronze_num = np.array([13,5,2,7,5])

绘制图形并展示

width = 0.3
# 设置bottom属性,表示柱体从bottom高度向上绘制
# 铜牌柱体在最下面
plt.bar(country_num, bronze_num, bottom=0,width=width,color='#4c300a',label='铜牌')
# 银牌在铜牌上面 bottom=bronze_num
plt.bar(country_num, silver_num, bottom=bronze_num,width=width,color='silver',label='银牌')
# 金牌在银牌上面 bottom=bronze_num+silver_num
plt.bar(country_num, gold_num, bottom=bronze_num+silver_num,width=width,color='gold',label='金牌')
plt.xlabel('国家', fontsize=14,loc='right')
plt.ylabel('奖牌数', fontsize=14,loc='top')
plt.title('冬奥会各个国家所获奖牌数',fontsize=18)
plt.xticks(country_num,countries,fontsize=14)
# 设置图例
plt.legend()
# 在每个柱体上面标记奖牌总数
for i in country_num:
    sum = bronze_num[i]+silver_num[i]+gold_num[i]
    plt.text(i, sum, sum, fontdict=dict(fontsize=14),va='bottom',ha='center')
plt.show()

Python绘制多种形式的条形图(柱状图)_图例_03