Study:day15-数据可视化之Matplotlib模块
1.1 水平条形图
python
import pandas as pd
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import sys
print('Python version:', sys.version)
print('Pandas version:', pd.__version__)
print('Numpy version:', np.__version__)
print('Matplotlib version:', matplotlib.__version__)
Python version: 3.12.4 | packaged by Anaconda, Inc. | (main, Jun 18 2024, 15:03:56) [MSC v.1929 64 bit (AMD64)]
Pandas version: 2.2.2
Numpy version: 1.26.4
Matplotlib version: 3.8.4
python
data = pd.read_csv('./data/奖牌.csv')
import matplotx
plt.style.use(matplotx.styles.pitaya_smoothie['light']) # 全局使用主题
plt.rcParams['font.sans-serif'] = 'STsong' # 全局设定中文字体
plt.rcParams['font.size'] = 14 # 全局指定字体大小
plt.figure(figsize=(12,8),dpi=100) # 创建一个画布
plt.barh([f"{i}奥运会" for i in data['赛事']], # x轴数据
width=data['总计'], # 柱子的宽度,
ec='black',linewidth=1,color='#00b8e5'
)
plt.ylabel('赛事名称') # 设定y轴名称
plt.xlabel('奖牌总数') # 设定x轴名称
plt.title('近10次奥运会中国奖牌总数',fontsize=16) # 设定标题名称
for i in range(data.shape[0]):
plt.text(
data['总计'][i]-1, # 先绘制x
[f"{i}奥运会" for i in data['赛事']][i], #后绘制y
data['总计'][i], # 标记的数据
va='center',ha='right',color='white'
)
plt.show()
1.2 金字塔水平条形图
python
data = pd.read_excel("./data/age.xlsx")
python
plt.figure(figsize=(16, 9), dpi=100)
plt.barh(data['age'][::-1], data['Male'][::-1], label='Male')
plt.barh(data['age'][::-1], -data['Female'][::-1], label='Female')
plt.xticks(plt.gca().get_xticks(), ['6%', '4%', '2%', '0%', '2%', '4%', '6%'])
plt.yticks(data['age'][::-1], data['age'][::-1] + '岁')
plt.legend()
for y, x1, x2 in zip(data['age'][::-1], data['Male'][::-1], -data['Female'][::-1]):
plt.text(x1 + 0.001, y, f"{round(x1 * 100, 2)}%", ha='right', va='center')
plt.text(x2 - 0.002, y, f"{round(-x2 * 100, 2)}%", ha='left', va='center')
plt.show()
1.3 散点图
1.3.1 基础散点图-多数据系列
python
data = pd.read_excel("./data/scatter.xlsx")
python
import matplotx
plt.rcParams['font.sans-serif'] = 'FangSong' # 全局设定中文字体
plt.rcParams['font.size'] = 14 # 全局指定字体大小
plt.style.use(matplotx.styles.pitaya_smoothie['light']) # 全局使用主题
plt.figure(figsize=(16, 9), dpi=100)
plt.scatter(data['x1'], # x轴数据
data['Series1'], # y轴数据
label='Series1', # 图例
s=50, # 点的大小
c='cyan', # 点的颜色
marker='*', # 点的形状
ec='black', # 边框颜色
linewidths=0.5, # 边框宽度
alpha=0.9 # 透明度
)
plt.scatter(data['x2'],data['Series2'],label='Series2',
s=50, # 调整点的大小
c='#e97d97', # 点的颜色
ec='black', # 边缘线条颜色
linewidths=1, # 边缘线条灯粗细
alpha=0.9, # 点填充的透明度
marker='s' # 点的类型
)
plt.scatter(data['x3'],data['Series3'],label='Series2',
s=50, # 调整点的大小
c='#61bae1', # 点的颜色
ec='black', # 边缘线条颜色
linewidths=1, # 边缘线条灯粗细
alpha=0.9, # 点填充的透明度
marker='v' # 点的类型
)
plt.xlabel('This x Label')
plt.ylabel('Value')
plt.title('The Basic Chart of Scatter')
plt.legend()
plt.show()
1.3.2 散点图进阶-气泡图
python
data = pd.read_csv("./data/mtcars.csv")
x = data['wt'] # 车的重量
y = data['mpg'] # 燃油效率
size = data['disp'] # 排量
color = data['hp'] # 马力
python
plt.figure(figsize=(12, 7),dpi=100)
plt.rcParams['font.sans-serif']='FangSong' # 全局设定中文字体
plt.rcParams['font.size'] = 14 # 全局指定字体大小
sca = plt.scatter(x, # 车的重量
y, # 燃油效率
s=size, # 排量. 使用size表示排量的大小,点越大,排量越大
c=color, # 马力, 使用颜色的深浅,表示马力的大小,马力越大,颜色越接近红色
ec='black', # 边缘线条颜色,
linewidths=1, # 边缘线条灯粗细
marker='o', # 点的类型
alpha=.8, # 设置透明度,
cmap='RdYlBu_r', # 创建一个颜色映射条
)
cbar = plt.colorbar(sca) # 显示颜色条
cbar.set_label('马力')
sizes = [20,40,140,180,220] # 设定点的列表,用于后续添加图例
# 绘制了多个散点图,主要用于标签设定,从而为后面添加图例,提供支持
sca_leg = [plt.scatter([],[],c='#61bae1',s=size,label=f"{size}") for size in sizes]
plt.legend(handles = sca_leg,title='排量') # 添加点大小的图例
plt.xlabel('车的重量')
plt.ylabel('车的燃油效率')
plt.title('The Scatter of Bubble Chart ')
plt.show()
python
plt.figure(figsize=(12, 7),dpi=100)
sca = plt.scatter(x, # 车的重量
y, # 燃油效率
# s=size, # 排量. 使用size表示排量的大小,点越大,排量越大
c=color, # 马力, 使用颜色的深浅,表示马力的大小,马力越大,颜色越接近红色
ec='black', # 边缘线条颜色,
linewidths=1, # 边缘线条灯粗细
marker='o', # 点的类型
alpha=.8, # 设置透明度,
cmap='RdYlBu_r', # 创建一个颜色映射条
)
cbar = plt.colorbar(sca) # 显示颜色条
cbar.set_label('马力')
plt.xlabel('车的重量')
plt.ylabel('车的燃油效率')
plt.title('The Scatter of Bubble Chart ')
for a,b,c in zip(x,y,data['name']):
plt.text(a+.1,b,c,ha='left',va='center',fontsize=10)
plt.xlim(1,7)
plt.ylim(5,40)
plt.show()
python
import matplotlib as mpl
print(mpl.get_cachedir())
C:\Users\Administrator\.matplotlib
1.4 Pie饼图系列
python
from pyecharts import faker
import pyecharts # pip install pyecharts==2.0.5
pyecharts.__version__
'2.0.5'
python
labels = faker.Faker.week_en
sizes = faker.Faker.values()
sorted(sizes)
colors = ['#b1cfe2', '#4a7fb4', '#c0df9c', '#61a54e', '#eba5a3', '#d0443a', '#efc283']
python
plt.figure(figsize=(16, 9), dpi=100)
plt.pie(sizes, #扇形的大小
labels=labels, #扇形的标签
colors=colors, #扇形的颜色
autopct='%.2f%%', #百分比文本格式
startangle=90, #扇形起始点角度
pctdistance=.7, #扇形内部标签距离圆心的距离
# hatch=['/', '-', '+', 'o', '.', '*', '\\'], # 指定扇形的填充样式
explode=[0.1, 0, 0.1, 0, 0, 0.1, 0], #分离指定的扇形
shadow=True, #添加阴影
frame=False, )
plt.show()
1.4.1扇形图进阶-环状饼图
python
data = [375, 75, 250, 300]
label = ['面粉', '糖', '奶油', '坚果']
def func(pct, allvals):
absoulte = int(np.round(pct / 1000 * np.sum(allvals)))
return f"{pct:.1f}%\n({absoulte:d}g)"
plt.rcParams['font.sans-serif'] = ['Times New Roman']
plt.figure(figsize=(16, 9), dpi=100)
wedges, texts, autotexts = plt.pie(data, labels=label,
autopct=lambda x: func(x, data), #设置标签的指定样式
wedgeprops={'width': 0.6}, #设定环状饼图.
)
# plt.pie(data,radius=0.3,colors=['white'])
plt.setp(texts, fontproperties='STsong') # 调整标签的字体,扇形外部标签文本
plt.setp(autotexts, fontproperties='Times New Roman', weight='bold') # 扇形内部标签文本
wedges[0].set_ec('red') # 可以设定每个扇形的样式
wedges[0].set_linestyle('dotted')
plt.show()
wedges:指的是每个扇形,所构建的集合对象
1.5 直方图
python
data = np.random.normal(0, 1, 10000)
python
plt.figure(figsize=(16, 9), dpi=100)
plt.hist(data, bins=50, color='skyblue', edgecolor='black')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Histogram Example')
plt.show()