文章目录
1.配置问题
字体乱码问题:
找到文件夹’\Users\用户名\.matplotlib
’,打开fontList.json
,查找中文字体如simHei,song,kai等,分别对应简体黑、宋体、楷体等,其对应的name字段值即为我们接下来将要设置的中文字体名,复制下来,代码首行插入:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Heiti TC'] # 指定默认字体:解决plot不能显示中文问题
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
2. 简单绘图
导入pyplot和numpy模块:
import matplotlib.pyplot as plt
import numpy as np
绘制出 − π - π −π到 π π π之间的正弦和余弦曲线:
X = np.arange(-np.pi, np.pi, 0.05) # 创建一个等差数列
C,S = np.cos(X),np.sin(X)
plt.plot(X, C, color="blue", linewidth=1.0, linestyle="-")
plt.plot(X, S, color="green", linewidth=1.0, linestyle="-")
plt.xlabel("弧度")
plt.ylabel("正弦值或余弦值")
plt.title("正弦波和余弦波")
plt.savefig('./test.jpg') #注意,savefig要放在plt.show()的前面,否则可能保存的图片是空白
plt.show()
结果:
3.使用面向对象方式绘图
虽然直接使用matplotlib.pyplot
模块很容易快速绘图,但建议使用面向对象的方法,它可以更好地控制和自定义绘图,也拥有更丰富强大的功能,主要思想是创建figure对象和axes对象,然后只调用这两个对象的方法或属性来绘图。
4.Figure类和Axes类
语法
首先要创建画布,就是创建figure对象,Figure
类是所有元素的顶级容器。通过从pyplot
模块调用figure()
函数进行实例化:
fig = plt.figure(figsize=(12,9),dpi= 200) # figsize:指定figure的宽和高;dpi:指定每英寸多少个像素
接下来创建Axes
对象,这是后续要继续创建各个元素的顶级容器,参数为列表[左位置,底位置,宽占比,高占比]
,一般取[0.1, 0.1, 0.8, 0.8]
:
ax = fig.add_axes([0.1,0.1,0.8,0.8])
实例
y = [1, 4, 9, 16, 25,36,49, 64]
x1 = [1, 16, 30, 42,55, 68, 77,88]
x2 = [1,6,12,18,28, 40, 52, 65]
fig = plt.figure(figsize=[12,9], dpi=200) # 创建Figure对象
ax = fig.add_axes([0.1,0.1,0.8,0.8]) # 基于fig对象调用add_axes方法创建Axes对象,参数为列表[左位置,底位置,宽占比,高占比]
l1 = ax.plot(x1,y,color='y',marker='s', linestyle='-', linewidth=2)
l2 = ax.plot(x2,y,color='g',marker='o', linestyle='--', linewidth=2)
ax.legend(labels = ['电视','智能手机'], loc = 'best', fontsize=15) # 添加图例,loc参数指定位置(best自动最优位置)
ax.grid(True) # 网格开启
ax.set_title('广告对销售的影响', fontsize=25)
ax.xaxis.set_tick_params(labelsize=15) # 设置x轴数字大小
ax.yaxis.set_tick_params(labelsize=15)
ax.set_xlabel('媒介', fontsize=20)
ax.set_ylabel('销售', fontsize=20)
plt.show()
结果:
5.subplots()函数创建多子图
语法
fig,ax = plt.subplots(nrows, ncols)
函数plt.subplots()
返回一个图形对象Figure
类型和一个包含等于nrows * ncols
的axe
s轴对象的NumPy array
类型,每个轴对象都可通过索引访问。
实例
fig,ax = plt.subplots(2,2)
x = np.arange(1,20)
ax[0][0].plot(x,x**2)
ax[0][0].set_title('平方')
ax[0][1].plot(x,np.sqrt(x))
ax[0][1].set_title('平方根')
ax[1][0].plot(x,np.exp(x))
ax[1][0].set_title('指数')
ax[1][1].plot(x,np.log10(x))
ax[1][1].set_title('对数')
plt.show()
结果:
6.轴刻度限制
语法
通过set_xlim(start, stop)
和set_ylim(start,stop)
函数设置轴刻度限制,例如:
ax.set_ylim(0,10000)
7.双轴设置
语法
当在同一个图中绘制具有不同单位的多个曲线时,Matplotlib通过twinx()
和twiny()
函数支持此功能
实例
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
x = np.arange(1,10)
ax1.plot(x,np.exp(x))
ax1.set_ylabel('exp')
ax2 = ax1.twinx() #twinx()是最常用的,在原轴图的基础上绘制双y轴图
ax2.plot(x,np.log(x),'r')
ax2.set_ylabel('log')
fig.legend(labels = ['exp','log'],loc = 'best')
plt.show()
结果:
8.条形图
语法
ax.bar(x, height, width, bottom, align)
其中必选参数为x
(x轴数值或标签组成的序列)和height
(y轴数值组成的序列)
实例
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x = ['C','C++','Python','Java','PHP']
students = list()
for i in range(5):
students.append(random.randint(0,50))ax.bar(x,students) plt.show()
结果:
对普通条形图进行一下优化
fig = plt.figure()
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
x = ['C', 'C++', 'Python', 'Java', 'PHP']
students = list()
for i in range(5):
students.append(random.randint(0, 50))
ax.bar(x,
students,
alpha=0.5, # 透明度
edgecolor='red' # 边框颜色
)
for a, b, label in zip(x, students,students): #内置函数zip():将几个列表合并为二维列表并转置,返回一个特殊对象,可通过list()列表化之后查看
plt.text(a, b, label, horizontalalignment = 'center', fontsize = 10) #plt.text()函数:在图中(a,b)位置添加一个文字标签label; horizontalalignment水平位置取中间;fontsize字体大小
ax.set_xlabel('专业')
ax.set_ylabel('学生人数')
ax.set_title('不同专业学生分布统计')
plt.show()
结果:
并列条形图(通过平移每个x值做两次bar图实现)实例
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x_tags = ['C','C++','Python','Java','PHP']
x = list(np.arange(5))
total_width, n = 0.8, 2
width = total_width / n
students = list()
for i in range(10):
students.append(random.randint(0,50))
students = np.array(students)
students = students.reshape(2,5) #这几步借用随机数和ndarray对象改变数组结构来灵活生成想要的2行5列随机序列
ax.bar(x, students[0], color = 'r', width = width)
for i in range(len(x)):
x[i] = x[i] + width
ax.bar(x, students[1], color = 'b', width = width,tick_label = x_tags) #tick_label参数给该bar图的x轴加上标签
ax.legend(labels=['女', '男'])
plt.show()
结果:
堆积条形图(通过bar()的bottom参数二次作图基底设为第一次的高度来实现)示例
N = 5
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
ind = np.arange(N) # the x locations for the groups
width = 0.35
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
ax.bar(ind, menMeans, width, color='r')
ax.bar(ind, womenMeans, width,bottom=menMeans, color='b')
ax.set_ylabel('分数')
ax.set_title('按组和性别分数')
ax.legend(labels=['男', '女'])
plt.show()
结果:
9.饼图
语法
matplotlib.pyplot.pie( x, explode=None, labels=None, colors=None, autopct=None, shadow=False, labeldistance=1.1)
实例
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
x_tags = ['C','C++','Python','Java','PHP']
students = [23,17,35,29,12]
explode = (0, 0, 0.1, 0, 0) # 爆炸主要用来在某几块占比太小文字重叠时使用,这里表示只爆炸第二块饼,爆炸距离是半径的0.1。
ax.axis('equal') # 等价于 ax.set(aspect='euqal'),使得饼图在figure窗口放大缩小的过程中,保持圆形不变。
ax.pie(students,labels = x_tags, explode=explode,autopct='%.1f%%',shadow=True) #autopct显示每块饼的百分比属性且自定义小数点位数
plt.show()
结果:
10.散点图
实例
girls_grades = [34, 25, 40, 40, 50, 66, 71, 67, 80, 89]
boys_grades = [30, 29, 49, 48, 56, 70, 55, 81, 70, 85]
homework_finish = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
fig = plt.figure()
ax = fig.add_axes([0.1,0.1,0.8,0.8])
ax.scatter(homework_finish, boys_grades, color = 'b', alpha = 0.5)
ax.scatter(homework_finish, girls_grades, color = 'r', alpha = 0.5)
ax.set_title('散点图实例')
ax.set_xlabel('作业完成情况(%)')
ax.set_ylabel('成绩')
ax.legend(labels = ('男生','女生'))
plt.show()
结果:
11.直方图和密度曲线
语法
对于一维数据的可视化,一般使用直方图和核密度曲线,seaborn.distplot()
函数可以方便地在同一图像上进行直方图和密度曲线的绘制,语法如下:
import seaborn as snssns.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, hist_kws=None, kde_kws=None, rug_kws=None, fit_kws=None, color=None, vertical=False, norm_hist=False, axlabel=None, label=None, ax=None)
常用参数:
bins
:int或list,控制直方图的划分,比如[0,1,2,3]以0,1,2,3为分割点,形成区间[0,1],[1,2],[2,3],区间外的值不计入
hist
:是否显示直方图(默认为True)
kde
:是否显示核密度估计(默认为True)
rug
:控制是否生成观测数值的小细条
hist_kws
, kde_kws, rug_kws
, fit_kws
:接收字典类型,可以自行定义更多高级的样式
实例
# 已有salarys是一个薪资列表,每个值已经除以1000
plt.figure(dpi=200)
sns.distplot(salarys, hist = True, kde = True, kde_kws={"color":"r", "lw":1.5, 'linestyle':'-'})
plt.axvline(mean, color='r', linestyle=":")
plt.text(mean, 0.01, '平均薪资: %.1f千'%(mean), color='r', horizontalalignment = 'center', fontsize = 15)
plt.xlim(0,50)
plt.xlabel('薪资分布(单位:千)')
plt.title('数据分析岗位在全国主要城市的薪资分布')
plt.savefig('./数据分析岗位在全国主要城市的薪资分布.jpg')
plt.show()
结果:
12.关键词频统计
语法
词云图是一种用来展现高频关键词的可视化表达,通过文字、色彩、图形的搭配,产生有冲击力地视觉效果,而且能够传达有价值的信息。wordcloud是优秀的词云展示第三方库,它把词云当作一个WordCloud
对象,绘制词云的形状,尺寸和颜色都可以设定。
cloud = WordCloud(Parameters).generate(words_str) # word_str:以空格分隔的词组成的字符串
实例
# words是一个由空格分隔的职位技能要求词组成的字符串
cloud = WordCloud(
font_path='/System/Library/Fonts/STHeiti Light.ttc', # 设置字体文件获取路径,默认字体不支持中文
background_color='white', # 设置背景颜色 默认是black
max_words=20, # 词云显示的最大词语数量
random_state = 1, # 设置随机生成状态,即多少种配色方案
collocations = False, # 是否包括词语之间的搭配,默认True,可能会产生语意重复的词语
width=1200, height=900 #设置大小,默认图片比较小,模糊
).generate(words)
plt.figure(dpi=200)
plt.imshow(cloud) # 该方法用来在figure对象上绘制传入图像数据参数的图像
plt.axis('off') # 设置词云图中无坐标轴
plt.savefig("./技能关键词频统计.jpg")
plt.show()
结果:
13.Andrews曲线
Andrews曲线是一种用来对多维数据降维可视化的工具
df = pd.read_csv('data.csv')
plt.figure(figsize=(12,9),dpi= 100)
pd.plotting.andrews_curves(df, 'Stage_Class', color=['r','b','g']) # 第二个参数:二维表中类别列的列名
plt.grid(alpha=0.3)
plt.show()