matplotlib基础图表绘制2

这篇博客介绍了三种数据可视化方法:堆叠柱状图、占比堆叠柱形图和带交互的可视化。堆叠柱状图展示了过去30年热狗大胃王比赛的前三名结果,而占比堆叠柱形图则展示了2020年各国年轻人、工作年龄和65岁以上人口的比例。最后,通过一个交互式的气泡图,展示了不同颜色和大小的气泡代表不同数据,鼠标悬停时会显示详细信息,提供了一种动态查看数据的手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆叠柱状图

import pandas as pd
from matplotlib import pyplot as plt
hotdog = pd.read_csv(r"hot-dog-places.csv")
fig,ax = plt.subplots(figsize=(10,6))
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False  
x_data = hotdog['Year']
y_data_1 = hotdog['First']
y_data_2 = hotdog['Second']
y_data_3 = hotdog['Third']
plt.bar(x=x_data,height=y_data_1,width=0.6,color='c',edgecolor='k')
plt.bar(x=x_data,height=y_data_2,width=0.6,color='g',edgecolor='k')
plt.bar(x=x_data,height=y_data_3,width=0.6,color='y',edgecolor='k')
ax = plt.gca()
ax.set_title(u'过去30年热狗大胃王比赛结果的柱状图',fontproperties='SimHei',fontsize=14)
ax.set_ylabel('前三名比赛结果')
ax.set_xlabel('年份')
plt.show()

占比堆叠柱形图

import pandas as pd
from matplotlib import pyplot as plt
population = pd.read_csv(r'population-young-working-old.csv')
fig,ax = plt.subplots(figsize=(10,6))
x_data = population['Entity']
y_data_1 = population['underFifteen']
y_data_2 = population['fifteenToSixtyFour']
y_data_3 = population['sixtyFourOrOver']
y1 = y_data_1/(y_data_1 + y_data_2 + y_data_3)
y2 = y_data_2/(y_data_1 + y_data_2 + y_data_3)
y3 = y_data_3/(y_data_1 + y_data_2 + y_data_3)
for y in y3:
    print('%.2f'% y)
l1 = plt.bar(x=x_data,height=y1 + y2 + y3,width=0.7,color='r',edgecolor='k')
l2 = plt.bar(x=x_data,height=y1 + y2,width=0.7,color='y',edgecolor='k')
l3 = plt.bar(x=x_data,height=y1,width=0.7,color='r',edgecolor='k')
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
ax.set_xlabel('各年龄段人口比例')
ax.set_ylabel('国家')
plt.title('2020年各国年轻人工作年龄和人群占比图')
plt.legend(loc='lower left',handles=[l1,l2,l3],labels=['15岁以下','15-64岁','65及岁以上'])
for x1,x2,ly1,ly2 in zip(x_data,x_data,y1,y2):
    plt.text(x1,ly1,'%.2f'% ly1,ha='center',va='bottom')
    ly3 = ly1 + ly2
    plt.text(x1, ly3, '%.2f' % ly3, ha='center', va='bottom')
plt.show()

带交互的可视化

import matplotlib.pyplot as plt
import numpy as np
# np.random.seed(1)#seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同
#随机生成15个正态分布为0-1的小数,储存在一个列表里边复制给x
x = np.random.rand(15)
#同理可得
y = np.random.rand(15)
#把字母a-o变成一个列表,并将此列表序列化为一个np对象的数组
names = np.array(list("ABCDEFGHIJKLMNO"))
#生成一个数组,数组中包含15个整数,每个数取值在1-5之间,左闭右开,即能取到1不能取到5
c = np.random.randint(1, 5, size=15)
#生成一个matplotlib的颜色对象,这里将数字和颜色做了归一化处理
norm = plt.Normalize(1, 4)
#色彩映射,设置为matplotlib内置的色彩映射,个人觉得没必要
cmap = plt.cm.RdYlGn
#新建画布
fig, ax = plt.subplots()
#绘制气泡图,c颜色,s大小,camp颜色映射,norm颜色与数字的归一
sc = plt.scatter(x, y, c=c, s=200, cmap=cmap, norm=norm)
#图像的标注,第一个参数是注释,xy是箭头尖端的位置,xytext表示标注的内容,一般与箭头有参照关系,即内容要根据箭头的位置合理定制
#textcoords注释文本的坐标系属性,offset points相对于被注释点xy的偏移量(单位是点)
#bbox设置注释文本的样式和箭头的样式,文本框类型round环绕型。
#arrowprops箭头参数设置:arrowstyle箭头样式设置为  ->
annot = ax.annotate("", xy=(0,0), xytext=(20, 20), textcoords="offset points",
                    bbox=dict(boxstyle="round", fc="w"), arrowprops=dict(arrowstyle="->"))
#隐藏箭头的坐标轴
annot.set_visible(False)
#定义更新箭头/文本的函数,随鼠标移动而显示
def update_annote(ind):
    #获得鼠标当前位置的气泡的偏移量,用于定位到鼠标当前位置的点
    pos = sc.get_offsets()[ind["ind"][0]]
    #打印鼠标当前位置的气泡的名称,名称为上边定义的1-15
    print(ind["ind"])
    #将当前鼠标对应的气泡的偏移量作为箭头的坐标
    annot.xy = pos
    #设置箭头对应的文本:前边两个{}b表示占位符,后边format表示填充占位符的内容,前边有多少个占位符,后边format里边就需要有多少个参数
    #ind["ind"]表示传进来的点的名称是一个列表,将列表与python内置字符串str进行映射,转换为一个列表,并将列表连接到" "这个空字符串中。
    #[names[n] for n in ind["ind"]]:表示循环鼠标对应位置气泡的所有名称,将前边定义的从a-o的字符串列表与鼠标对应位置的名称做映射
    text = "{},{}".format(" ".join(list(map(str, ind["ind"]))), " ".join([names[n] for n in ind["ind"]]))
    #设置连接箭头的文本框中的内容为刚才定义的text
    annot.set_text(text)
    #设置鼠标停留的位置产生的文本框的颜色,也是采用了 数字与matplotlib内置颜色做映射产生的颜色
    annot.get_bbox_patch().set_facecolor(cmap(norm(c[ind["ind"][0]])))
    #设置鼠标停留的位置的文本框的颜色的透明度
    annot.get_bbox_patch().set_alpha(0.4)
#定义一个处理事件
def hover(event):
    #定义标志的坐标显示
    vis =annot.get_visible()
    #利用event的inaxes属性获取当前trace
    #跟踪当前事件的位置,如果停留在了我们的画布中则进行处理
    if event.inaxes ==ax:
        #将停留在画布中包含了此事件的数据复制给cont,ind
        cont, ind = sc.contains(event)
        #如果cont有数据,即鼠标停留在了气泡上
        if cont:
            #调用更新箭头/文本函数,将当前位置的位置信息传给更新函数,并更新出新的位置的文本信息
            update_annote(ind)
            annot.set_visible(True)
            #实现刷新的条件
            fig.canvas.draw_idle()
        #如果鼠标没有停留在气泡上
        else:
            #关闭鼠标位置的内容显示
            if vis:
                annot.set_visible(False)
                # 实现刷新的条件
                fig.canvas.draw_idle()
#绑定鼠标事件,设置事件名字
fig.canvas.mpl_connect("motion_notify_event", hover)
#显示图像
plt.show()

气泡字母图,交互

import matplotlib.pyplot as plt
import numpy as np
#新建一个画布,
figsrc, axsrc = plt.subplots()
figzoom, axzoom = plt.subplots()
#autoscale_on代表坐标轴是否自动缩放
#设置坐标轴的范围,xlim表示只显示0-1,ylim同理,autoscal_on表示坐标轴根据图例大小自动缩放,title即标题
axsrc.set(xlim=(0, 1), ylim=(0, 1), autoscale_on=False,
          title='Click to zoom')

axzoom.set(xlim=(0.45, 0.55), ylim=(0.4, 0.6), autoscale_on=False,
           title='Zoom window')
#np.random.rand()生成四组正态分布为0-1的随机数,每组200个,并讲这四组两百个数据分别复制给x,y,s,c
x, y, s, c = np.random.rand(4, 200)
s *= 200
#绘制气泡图,x,y分别表示x,y轴,s表示各个气泡的大小,默认为20,可以传一个数组,使得每个气泡大小都是随机的,但不会重复。c表示颜色
axsrc.scatter(x, y, s, c)
axzoom.scatter(x, y, s, c)
#定义一个点击事件,当点击的时候调用
def onpress(event):
    #当点击的是鼠标右键,则不处理事件
    if event.button != 1:
        return
    #当点击的是鼠标左键,处理事件
    x, y = event.xdata, event.ydata # 获取事件的X和Y坐标
    #设置新图表的x的轴的显示范围,这里得到点击旧图表的x位置,再在原来的基础上加减0.1使得新图表的坐标轴范围变小,对应位置的气泡被映射增大
    axzoom.set_xlim(x - 0.1, x + 0.1)
    # 设置新图表的y的轴的显示范围,同理可得
    axzoom.set_ylim(y - 0.1, y + 0.1)
    #绘制新图表
    figzoom.canvas.draw()
#鼠标事件绑定。绑定上边定义的onpress事件
figsrc.canvas.mpl_connect('button_press_event', onpress)
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值