目录
一、安装、升级与卸载
pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade matplotlib==xxx # 升级为指定版本,xxx为版本号
# pip uninstall matplotlib # 卸载
二、导入使用
import matplotlib.pyplot as plt
# 查看包的方法
print(dir(plt))
三、Matplotlib图表设置
3.1 导入使用
import matplotlib.pyplot as plt
%matplotlib inline #用于在笔记本内联显示matplotlib图表
%config InlineBackend.figure_format = 'svg' #确保图表以SVG格式显示
plt.rcParams["font.sans-serif"] = 'Microsoft YaHei' #解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False #解决负号无法显示
3.2 图表样式设置
# # 改变图表的外观,例如颜色、线条风格等
plt.style.available#查看matplotlib库的绘图样式
#选择设置图表演示为ggplot类型
plt.style.use("ggplot")
3.3 建立画布
#设置图表画布大小,先使用 plt.figure()来初始化图形窗口
plt.figure(figsize = (9, 6))
figure(num=None, figsize=(8, 6), dpi=80, facecolor='w', edgecolor='k')
参数解释:
- num:字符串或整数
- figsize:图形的宽高
- dpi:分辨率
- facecolor:图形背景颜色
- edgecolor:图形边缘颜色
四、基本元素设置
包括坐标轴标题、轴显示、图表标题、图例等
# 绘制一个简单的折线图
import numpy as np
plt.plot(np.random.randn(100))
4.1 坐标轴标题
plt.xlabel(xlabel, fontdict=None, labelpad=None, fontsize, loc='center', **kwargs)
plt.ylabel(xlabel, fontdict=None, labelpad=None, fontsize, loc='center', **kwargs)
参数解释:
- xlabel:标签文本
- fontdict:设置字体属性
- labelpad:标签与轴距离
- fontsize:标签字体大小
- loc:标签位置
- linespacing:标签与轴线之间的距离
- horizontalalignment, va, ha:这些参数用于调整标签的水平和对齐方式
- rotation:旋转标签角度
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#使用Series模拟一组数据
s = pd.Series(data=np.random.randn(3600),
index=pd.date_range('20170101',periods=3600),
)
cs = s.cumsum()#累计和
cs.plot(figsize = (9, 6))#设置图表大小
plt.xlabel("年份",labelpad = 20) #设置X轴距离,labelpad控制标题到图表的距离
plt.ylabel("网页浏览量",labelpad = 20) #设置Y轴距离,labelpad控制标题到图表的距离
4.2 图表标题
plt.title(label, fontdict=None, loc='center', pad=None, *, y=None, **kwargs)
4.3 图表图例
plt.legend(labels, loc, fontsize, ncol, shadow, **kwargs)
参数解释:
- labels:设置图例的列表
- loc:图例位置,'upper left'、'upper right'、'lower left'、'lower right'
- ncol:图例列数
- frameon:图例是否显示例外框
import pandas as pd
import numpy as np
#模拟一组数据
s = pd.Series(data=np.random.randn(3600),
index=pd.date_range('20170101',periods=3600),
)
cs = s.cumsum()#累计和
cs.plot(figsize = (9, 6))#设置图表大小
#frameon=False,图例去除边框
plt.legend(loc = "upper center",title='浏览量',title_fontsize=10,frameon=False,shadow=True)
4.4 轴显示设置
plt.axis(option, *args, **kwargs)
参数解释
- 'off':关闭坐标轴标签和刻度线
- 'on':打开坐标轴标签和刻度线(默认)
- 'tight':设置坐标轴范围以适应数据范围,即坐标轴紧密地包围数据
- 'equal':设置等比例的坐标轴,使得 x 和 y 轴具有相同的刻度间隔
import pandas as pd
import numpy as np
#模拟一组数据
s = pd.Series(data=np.random.randn(3600),
index=pd.date_range('20130101',periods=3600),
)
cs = s.cumsum()#累计和
cs.plot(figsize = (9, 6))
plt.axis("off") #简化图表,可关闭坐标轴及标题
五、基本图表设置
5.1 点、线设置
df.plot(kind='line', ax=None, subplots=False, sharex=None, sharey=False, layout=None, figsize=None, use_index=True, title=None, grid=None, legend=True, style=None, logx=False, logy=False, loglog=False, xticks=None, yticks=None, xlim=None, ylim=None, rot=None, fontsize=None, colormap=None, table=False, yerr=None, xerr=None, label=None, secondary_y=False, sort_columns=False, **kwds)
参数解释
- kind:指定图表类型(line、bar、barh、hist、box、kde)
- ax:用于绘制图形的 matplotlib 轴对象
- subplots:如果为 True,则为每个数据列创建一个子图
- sharex、sharey:如果为 True,则 x 或 y 轴将在子图之间是共享的
- layout:用于指定子图布局的元组
- figsize:用于指定图形大小的元组
- xticks、yticks:用于指定 x 轴和 y 轴的刻度的值
- xlim、ylim:用于指定 x 轴和 y 轴的范围
- colormap:用于指定颜色映射
- secondary_y:如果为 True,则在右侧显示第二个 y 轴
- sort_columns:如果为 True,则按照列名对数据进行排序
import pandas as pd
import numpy as np
df=pd.DataFrame(data=np.random.randint(low=100,high=1000,size=30),
index=pd.date_range('20231101',periods=30),
columns=['销量'])
df.plot(color = "red",linestyle = "--", linewidth = 2, marker = "o", markersize = 10, figsize = (9, 6))
5.2 坐标轴刻度
plt.xticks(*ticks, labels=None, **kwargs)
plt.yticks(*ticks, labels=None, **kwargs)
参数解释
- ticks:用于设置 x 轴上的刻度位置。可以传入一个列表或数组,指定刻度的位置
- labels:用于设置每个刻度的标签文本。可以传入一个字符串列表,用于指定每个刻度的标签
import pandas as pd
import numpy as np
df=pd.DataFrame(data=np.random.randint(low=100,high=1000,size=30),
index=pd.date_range('20231101',periods=30),
columns=['销量'])
df.plot()
plt.xticks(ticks = pd.date_range('20231101',periods=30), labels = ['{}日'.format(i+1) for i in range(30)],rotation=45)#设置X坐标轴刻度
plt.yticks(ticks = np.arange(100,1100,100),labels = ['{}单'.format(i*100) for i in range(10)])#设置Y坐标轴刻度
5.3 坐标轴范围
plt.xlim(bottom, top)
plt.ylim(bottom, top)
5.4 数据标签
plt.text(x, y, s, fontdict=None, withdash=False, **kwargs)
参数解释:
- x,y:是标签坐标位置
- s:文本内容
- withdash:布尔值参数,如果是True,则使用破折号(~)表示的文本
- ha:水平对齐center、left、right
- va:垂直对齐center、top、bottom
import pandas as pd
import numpy as np
df=pd.DataFrame(data=np.random.randint(low=100,high=1000,size=30),
index=pd.date_range('20231101',periods=30),
columns=['销量'])
df.plot()
for x,y in zip(pd.date_range('20231101',periods=30),df['销量'].values):
plt.text(x,y,y,ha='center',va='bottom',fontsize=8)
5.5 网格线
plt.grid(b=None, which='major', axis='both', **kwargs)
参数解释
- b:布尔值,可选参数。决定是否显示网格线
- which:布尔值,可选参数。显示网格线类型major,minor,both
- axis:用于指定在哪个轴上显示网格线x,y,both
- linestyle:用于设置网格线的线型,‘--’ ‘-’
- alpha:用于设置网格线的透明度
import pandas as pd
import numpy as np
df=pd.DataFrame(data=np.random.randint(100,1000,size=30),
index=pd.date_range('20231101',periods=30),
columns=['销量'])
df.plot()
plt.grid(color='red', linestyle='--', alpha=0.3, axis='y', visible = True)#设置网格线为虚线,axis='y'可只对Y轴打开网格线
六、共轴坐标轴
6.1 共享X轴
如果要共用一个X坐标轴,Y坐标轴分别展示,可设置参数subplots=True,这样设置为共X坐标轴数据图。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(2000,4),
index=pd.Series(pd.date_range('20240101',periods=2000)),
columns=list('ABCD'))
df = df.cumsum() # 累计求和
df.plot(figsize=(10,6),subplots=True)
plt.legend(loc='best')
6.2 共享Y轴
做多个数据系列折线图时默认是共用Y轴的,可以展示不同系列数据在时间趋势上的波动变化。
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.randn(2000,4),
index=pd.Series(pd.date_range('20240101',periods=2000)),
columns=list('ABCD'))
df = df.cumsum() # 累计求和
df.plot(figsize=(10,6))
plt.legend(loc='best')
七、案例
7.1 折线图——销量趋势
折线图是一种用折线的升降来表示统计数据变动趋势的图形。通常用于显示数据随时间或有序类别的波动情况,可以清楚地反映数据增减变化的趋势和变化幅度。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.style as psl
# %matplotlib inline # 魔法命令,用于在笔记本内联显示matplotlib图表
# %config InlineBackend.figure_format = 'svg' # 确保图表以SVG格式显示
plt.rcParams["font.sans-serif"] = 'Microsoft YaHei' #解决中文乱码问题
plt.rcParams['axes.unicode_minus'] = False #解决负号无法显示
psl.use('ggplot')
plt.figure(figsize=(10,6))
df=pd.DataFrame(data=np.random.randint(low=100,high=1000,size=30),
index=pd.date_range('20231101',periods=30),
columns=['销量'])
df.plot(color='red',linestyle='dashdot',linewidth=1,marker = "o", markersize = 5,figsize=(10,6))
plt.xlabel("年份",labelpad=20) # 设置x轴标签
plt.ylabel("销量",labelpad=20) # 设置y轴标签
plt.title("双十一销售量数据趋势",loc='center') # 设置标题
plt.legend(title="销量",loc='upper center',title_fontsize=10,frameon=False) # 设置图例
plt.xticks(pd.date_range('20231101',periods=30),['{}日'.format(i+1) for i in range(30)],rotation=45) # 设置x轴刻度
plt.yticks(np.arange(100,1100,100),['{}单'.format(i*100) for i in range(10)]) # 设置y轴刻度
plt.ylim(0,1100) # 设置y轴范围
for x,y in zip(pd.date_range('20231101',periods=30),df['销量'].values): # 设置数据标签
plt.text(x,y,y, ha='center',va='bottom',fontsize=9)
7.2 柱形图——比较数据分布
柱形图是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值,通常利用于较小的数据集分析
#导入数据
df=pd.DataFrame(data={'客户性别':['男','女'],
'销售数': np.random.randint(low=100,high=5000,size=2)}
)
x=df['客户性别'].tolist()
y=df['销售数'].tolist()
#绘制柱状图
plt.bar(x,y,width=0.2,align='center',label='销售量')
plt.title('不同性别客户销售数',loc='center')
#设置x和y轴的名称
plt.xlabel('客户性别')
plt.ylabel('销售数')
#添加数据标签
for a,b in zip(x, y):
plt.text(a,b,b,ha = "center", va = "bottom", fontsize = 12)
plt.legend(loc='upper center',title_fontsize=10,frameon=False) #显示图例
plt.show() #显示图像
7.3 条形图——多条数据分类对比
条形图是用宽度相同的条形的高度或长短来表示数据变动的图形。条形图可以横置或纵置,纵置时也称为柱形图,可横向做分类对比。
psl.use('ggplot')
plt.figure(figsize=(10,6))
#导入数据
df=pd.DataFrame(data={'商品品类':['床品件套','厨房电器','汽车配件','浴室用品',
'卧室家具','电脑硬件','家装饰品','办公家具'],
'销售数': np.random.randint(low=100,high=5000,size=8)}
)
x=df['商品品类'].tolist()
y=df['销售数'].tolist()
# 绘制柱状图
plt.barh(x,width=y,height=0.5,align='center',label='销售数')
plt.title('不同商品品类销售数',loc='center')
plt.xlabel('销售数')
plt.ylabel('商品品类')
for a,b in zip(x,y):
plt.text(b,a,b,ha = "center", va = "center", fontsize = 12)
plt.legend(loc='upper right')#显示图例
7.4 饼图——表示占比
主要用于表示一个样本(或总体)中各组成部分的数据占全部数据的比例
#导入数据
df=pd.DataFrame(data={'区域':['华东','华北','东北','西北','西南','华南'],
'销售数': np.random.randint(low=100,high=5000,size=6)}
)
x = df['销售数'].tolist()
labels = df['区域'].tolist()
explode = [0.05,0.05,0,0,0,0] # 用于突出显示特定区域
plt.pie(x,
autopct='%0.1f%%', #数据标签
labels=labels,
startangle=90, #初始角度
explode=explode, # 突出显示数据
pctdistance=0.87, # 设置百分比标签与圆心的距离
textprops = {'fontsize':12, 'color':'k'}, # 设置文本标签的属性值
counterclock = False, # 是否逆时针
)
plt.title("双11各区域销售数占比")
7.5 图表选择
- 比较数据:当你需要比较不同类别或不同时间点的数据时,条形图和饼图是很好的选择。条形图可以用来比较不同类别的数据,而饼图则可以用于展示部分与整体的关系。
- 趋势分析:如果你想展示数据的趋势,例如随时间的变化,线形图或柱状图是很好的选择。线形图适用于时间序列数据,而柱状图则在类别数据上效果更好。
- 部分与整体的关系:饼图或堆叠条形图可以用来展示部分与整体的关系。饼图适用于简单的比例关系,而堆叠条形图可以用于显示不同类别的累积效应。
- 相关性分析:如果你想展示两个变量之间的关系,散点图是好的选择。通过散点图,你可以观察到两个变量之间的趋势和关联。
- 时间序列数据:如果你正在处理时间序列数据,例如温度随时间的变化,那么线形图或者柱状图(如果时间被解释为类别)可能都会很有效。
- 多变量数据:如果你有多维度的数据需要展示,例如多个产品在不同地区和时间的销售情况,可能需要使用更复杂的图表类型,如热力图、小提琴图等。