* 柱状图是一种用矩形柱来表示数据分类的图表
* 柱状图可以垂直绘制,也可以水平绘制
* 它的高度与其所表示的数值成正比关系
* 柱状图显示了不同类别之间的比较关系,图表的水平轴X指定被比较的类别,垂直轴Y则表示具体的类别值
matplotlib.pyplot.bar(x,height,width:float=0.8,bottom=None,*,align:str=‘center’,data=None,**kwargs)
import matplotlib.pyplot as plt
# x轴数据
x = range(5)
# y轴数据
data = [5,20,15,25,10]
# 设置图形标题
plt.title('基本柱状图')
# 绘制网格
plt.grid(ls='--',alpha=0.2,color='r') # alpha表示透明度,alpha参数的值越小,就越透明,当alpha=0时完全透明
# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
# bar绘制图形,x表示x坐标,data表示柱状图的高度
plt.bar(x,data)
# bar绘制图形,x表示x坐标,data表示柱状图的高度
# bottom参数表示柱状图的起始位置,也就是y轴的起始坐标,默认值为None
plt.bar(x,data,bottom=[10,20,5,0,10])
# bar绘制图形,x表示x坐标,data表示柱状图的高度
# facecolor参数设置柱状图的颜色,只能设置单个颜色值
plt.bar(x,data,facecolor='yellow')
# bar绘制图形,x表示x坐标,data表示柱状图的高度
# color参数设置柱状图的颜色,可以设置多个颜色值
plt.bar(x,data,color=['r','g','b','y'])
import matplotlib.pyplot as plt
# y轴数据
data = [5,20,15,25,10]
plt.title('设置边缘线条样式')
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
plt.bar(range(len(data)),data,ec='r',ls='--',lw=2)
import matplotlib.pyplot as plt
# x轴数据
x = range(5)
# y轴数据
data = [5,20,15,25,10]
# 设置柱子的刻度标签
labels = ['Tom','Dick','Harry','Slim','Jim']
plt.title('设置柱子的刻度标签')
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
plt.bar(labels,data)
同一x轴位置绘制多个柱状图,主要通过调整柱状图的宽度和每个柱状图x轴的起始位置。
分析:
import matplotlib.pyplot as plt
import numpy as np
# 设置基本属性
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
gold_medal = [16,12,9,8,5]
# 银牌个数
silver_medal = [8,10,4,10,5]
# 铜牌个数
bronze_medal = [13,5,2,7,5]
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
plt.bar(countries,gold_medal,color='gold',width=0.2) # 通过color设置柱状图的颜色,通过width参数设置柱状图的宽度
plt.bar(countries,silver_medal,color='silver',width=0.2)
plt.bar(countries,bronze_medal,color='c',width=0.2)
import matplotlib.pyplot as plt
import numpy as np
# 设置基本属性
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
golden_medal = [16,12,9,8,5]
# 银牌个数
silver_medal = [8,10,4,10,5]
# 铜牌个数
bronze_medal = [13,5,2,7,5]
# 1.将x轴转换为数值
x = np.arange(len(countries))
print(x)
# 2.设置图形的宽度(柱形图每条柱子的宽度)
width = 0.2
# ===========确定x的起始位置======================
# 金牌起始位置
golden_x = x
# 银牌的起始位置
silver_x = x + width
# 铜牌的起始位置
bronze_x = x + 2 * width
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
# =========分别绘制图形=====================
# 绘制金牌图形
plt.bar(golden_x,golden_medal,width=width,color='gold',label='金牌')
# 绘制银牌图形
plt.bar(silver_x,silver_medal,width=width,color='silver',label='银牌')
# 绘制铜牌图形
plt.bar(bronze_x,bronze_medal,width=width,color='brown',label='铜牌')
plt.legend() # 显示图例
# ==========将坐标变回来==========================
# 注意将x轴标签的位置居中
plt.xticks(x+width,labels=countries)
# ----------------------显示高度文本-------------------------
for i in range(len(countries)):
# 金牌的文本设置
# plt.text()中前两两个参数表示绘制文字的x坐标和y坐标,第2个参数表示要添加的文字,va参数表示垂直位置,ha表示水平位置
plt.text(golden_x[i],golden_medal[i],golden_medal[i],va='bottom',ha='center')
# 银牌的文本设置
plt.text(silver_x[i],silver_medal[i],silver_medal[i],va='bottom',ha='center')
# 铜牌的文本设置
plt.text(bronze_x[i],bronze_medal[i],bronze_medal[i],va='bottom',ha='center')
plt.show()
分析:
import matplotlib.pyplot as plt
import numpy as np
# 设置基本属性
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
golden_medal = [16,12,9,8,5]
# 银牌个数
silver_medal = [8,10,4,10,5]
# 铜牌个数
bronze_medal = [13,5,2,7,5]
# 设置图形的宽度(柱形图每条柱子的宽度)
width = 0.3
# ===========确定y的起始高度======================
# 将列表转换为numpy数组,再用numpy数组的性质进行两数组相加
# 铜牌的起始高度
bronze_y = np.array(bronze_medal)
# 银牌榜的起始高度
silver_y = bronze_y + np.array(silver_medal)
# 金牌榜的起始高度
golden_y = silver_y + np.array(gold_medal)
# 每个国家总的奖牌数
medal_sum = golden_y
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
# =========分别绘制图形=====================
# 绘制金牌图形
plt.bar(countries,golden_y,width=width,color='gold',label='金牌')
# 绘制银牌图形
plt.bar(countries,silver_y,width=width,color='silver',label='银牌')
# 绘制铜牌图形
plt.bar(countries,bronze_y,width=width,color='brown',label='铜牌')
plt.legend() # 显示图例
# # ----------------------显示高度文本-------------------------
for i in range(len(countries)):
# 奖牌总数的文本设置
# plt.text()中前两两个参数表示绘制文字的x坐标和y坐标,第2个参数表示要添加的文字,va参数表示垂直位置,ha表示水平位置
plt.text(countries[i],medal_sum[i],medal_sum[i],va='bottom',ha='center')
plt.show()
或者使用plt.bar()函数中的bottom参数设置柱子的起始高度:
import matplotlib.pyplot as plt
import numpy as np
# 设置基本属性
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
golden_medal = [16,12,9,8,5]
# 银牌个数
silver_medal = [8,10,4,10,5]
# 铜牌个数
bronze_medal = [13,5,2,7,5]
# 设置图形的宽度(柱形图每条柱子的宽度)
width = 0.3
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
# =========分别绘制图形=====================
# 通过bar()函数的bottom参数设置柱子的起始高度
# 绘制铜牌图形
plt.bar(countries,bronze_medal,width=width,color='brown',label='铜牌') # 铜牌柱子的起始高度为0,是bottom参数的默认值
# 绘制银牌图形
plt.bar(countries,silver_medal,width=width,color='silver',label='银牌',bottom = bronze_medal)
# 绘制金牌图形
plt.bar(countries,golden_medal,width=width,color='gold',label='金牌',bottom = np.array(bronze_medal) + np.array(silver_medal))
plt.legend() # 显示图例
# # ----------------------显示高度文本-------------------------
nums = []
for i in range(len(countries)):
medal_sum = bronze_medal[i] + silver_medal[i] + gold_medal[i]
nums.append(medal_sum)
# 奖牌总数的文本设置
# plt.text()中前两两个参数表示绘制文字的x坐标和y坐标,第2个参数表示要添加的文字,va参数表示垂直位置,ha表示水平位置
plt.text(countries[i],medal_sum,medal_sum,va='bottom',ha='center')
print(nums)
plt.show()
调用matplotlib的barh()函数可以生成水平柱状图
barh()函数的用法与bar()函数的用法基本一样,只是在调用barh()函数时使用y参数传入Y轴数据,使用width参数传入代表条柱宽度的数据。
plt.barh(y,width,height=0.8,left=None,*,align=‘center’,**kwargs)
import matplotlib.pyplot as plt
import numpy as np
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False # 中文负号
# 设置分辨率为100
plt.rcParams['figure.dpi'] = 100
# 设置画布的大小
plt.rcParams['figure.figsize'] = (5,3)
# 国家
countries = ['挪威','德国','中国','美国','瑞典']
# 金牌个数
golden_medal = [16,12,9,8,5]
# # 银牌个数
# silver_medal = [8,10,4,10,5]
# # 铜牌个数
# bronze_medal = [13,5,2,7,5]
# y轴为国家,宽度为奖牌数
plt.barh(countries,width=golden_medal)
plt.show()
实例:三天中3部电影的票房变化
movie = [‘新蝙蝠侠’,‘狙击手’,‘奇迹笨小孩’]
real_day1 = [4053,2548,1543]
real_day2 = [7840,4013,2421]
real_day3 = [8080,3673,1342]
分析:
1.确定图形距离左侧的位置
2.设置同一高度
3.绘制图形设置left参数
4.标注数据——plt.text()
绘制水平堆叠柱状图
代码如下:
import matplotlib.pyplot as plt
import numpy as np
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = [4053,2548,1543] # 第一天
real_day2 = [7840,4013,2421] # 第二天
real_day3 = [8080,3673,1342] # 第三天
# ========================确定左侧距离=============================
left_day1 = 0
left_day2 = np.array(real_day1) # 第二天距离左侧的距离为第一天的数值
left_day3 = left_day2 + np.array(real_day2) # 第三天距离左侧的距离为第一天+第二天的数值
# 设置柱子的高度
height = 0.2
# 绘制图形
plt.barh(movie,real_day1,left=left_day1,height=height) # 第一天图形
plt.barh(movie,real_day2,left=left_day2,height=height) # 第二天图形
plt.barh(movie,real_day3,left=left_day3,height=height) # 第三天图形
# 设置数值文本:计算宽度值和y轴为值
sum_data = np.array(real_day1) + np.array(real_day2) + np.array(real_day3)
for i in range(len(movie)):
plt.text(sum_data[i],movie[i],sum_data[i],va='center',ha='left')
plt.xlim(0,sum_data.max()+2000)
import matplotlib.pyplot as plt
import numpy as np
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = [4053,2548,1543] # 第一天
real_day2 = [7840,4013,2421] # 第二天
real_day3 = [8080,3673,1342] # 第三天
# ========================确定左侧距离=============================
left_day1 = np.array([0,0,0],dtype=np.uint8)
left_day2 = np.array(real_day1) # 第二天距离左侧的距离为第一天的数值
left_day3 = left_day2 + np.array(real_day2) # 第三天距离左侧的距离为第一天+第二天的数值
# 设置线条的高度
height = 0.2
# 绘制图形
plt.barh(movie,real_day1,left=left_day1,height=height) # 第一天图形
for i in range(len(movie)):
plt.text(left_day1[i],movie[i],real_day1[i],size=8,va='center',ha='left')
plt.barh(movie,real_day2,left=left_day2,height=height) # 第二天图形
for i in range(len(movie)):
plt.text(left_day2[i],movie[i],real_day2[i],size=8,va='center',ha='left')
plt.barh(movie,real_day3,left=left_day3,height=height) # 第三天图形
for i in range(len(movie)):
plt.text(left_day3[i],movie[i],real_day3[i],size=8,va='center',ha='left')
plt.xlim(0,sum_data.max()+2000)
运行结果:
import matplotlib.pyplot as plt
import numpy as np
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = [4053,2548,1543] # 第一天
real_day2 = [7840,4013,2421] # 第二天
real_day3 = [8080,3673,1342] # 第三天
real_days = [real_day1,real_day2,real_day3]
# ========================确定左侧距离=============================
left_day1 = np.array([0,0,0],dtype=np.uint8)
left_day2 = np.array(real_day1) # 第二天距离左侧的距离为第一天的数值
left_day3 = left_day2 + np.array(real_day2) # 第三天距离左侧的距离为第一天+第二天的数值
left_days = np.array([left_day1,left_day2,left_day3])
# 设置线条的高度
height = 0.2
# 绘制图形
for j in range(len(movie)):
plt.barh(movie,real_days[j],left=left_days[j],height=height)
for i in range(len(movie)):
plt.text(left_days[j][i],movie[i],real_days[j][i],size=8,va='center',ha='left') # 使用size参数设置字体大小
# plt.barh(movie,real_day1,left=left_day1,height=height) # 第一天图形
# for i in range(len(movie)):
# plt.text(left_day1[i],movie[i],real_day1[i],va='center',ha='left')
# plt.barh(movie,real_day2,left=left_day2,height=height) # 第二天图形
# for i in range(len(movie)):
# plt.text(left_day2[i],movie[i],real_day2[i],va='center',ha='left')
# plt.barh(movie,real_day3,left=left_day3,height=height) # 第三天图形
# for i in range(len(movie)):
# plt.text(left_day3[i],movie[i],real_day3[i],va='center',ha='left')
# 设置数值文本(总数量):计算宽度值和y轴为值
sum_data = np.array(real_day1) + np.array(real_day2) + np.array(real_day3)
for i in range(len(movie)):
plt.text(sum_data[i],movie[i],sum_data[i],size=8,va='center',ha='left') # 使用size参数设置字体大小
plt.xlim(0,sum_data.max()+2000)
import matplotlib.pyplot as plt
import numpy as np
movie = ['新蝙蝠侠','狙击手','奇迹笨小孩']
real_day1 = [4053,2548,1543] # 第一天
real_day2 = [7840,4013,2421] # 第二天
real_day3 = [8080,3673,1342] # 第三天
real_days = [real_day1,real_day2,real_day3]
# 设置字体,正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来设置字体样式以正常显示
plt.rcParams['axes.unicode_minus'] = False
#-------1.将y轴转换为数值型------------------------------
movie_y = np.arange(len(movie))
# ------2.设置同图形的高度-------------------------------
height = 0.2
# ------3.计算每个图形高度的起始位置----------------------
height_day1 = movie_y
height_day2 = height_day1 + height
height_day3 = height_day2 + height
height_days = [height_day1,height_day2,height_day3]
# ------4.绘制图形--------------------------------------
for i in range(len(movie)):
plt.barh(height_days[i],real_days[i],height=height)
# 给每一个柱子添加文本数值
for j in range(len(real_day1)):
# 第一参数表示文本的x轴坐标,第二个参数表示文本的y轴坐标,第三个参数表示文本数值
plt.text(real_days[i][j],height_days[i][j],real_days[i][j],size=8,ha='left',va='center')
#-------5.替换y轴并将将y轴标签居中---------------------
plt.yticks(movie_y + height , labels=movie) # 第一个参数用来设置y轴上的刻度值,label用来设置对应刻度值的标签
运行结果:
绘图发现,右边文本数值超出边框,有两个方法可以解决:1、去掉右边和上侧的spines;2、使用xlim设置x轴的显示范围。
# 1、去掉右边和上侧的spines
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
# 2、使用xlim设置x轴的显示范围
plt.xlim(0,np.array(real_days).max()+2000)
直方图(Histogram),又称为质量分布图,它是条形图的一种,由一系列不等高的纵向线来表示数据分布情况。直方图的横轴表示数据类型,纵轴表示分布情况。
柱状图和直方图的区别在于,直方图用于概率分布,它显示了一组数值序列在给定的数值范围内出现的概率;而柱状图则用于展示各个类别的频数。
柱状图 | 直方图 |
---|---|
柱状图一般用于描述离散型分类数据的对比 | 直方图一般用于描述连续型数据的分布关系 |
每根柱子宽度固定,柱子之间会有间距 | 每根柱子宽度可以不一样,且一般没有间距 |
横轴变量可以任意排序 | 横轴变量有一定顺序规则 |
将统计值的范围分段,即将整个值的范围分为一系列间隔,然后计算每个间隔有多少个值。直方图也可以被归一化以显示“相对频率”。然后,它显示了属于几个类别中每个类别的占比,其高度总和等于1。
plt.hist(x,bins=None,range=None,density=None,weights=None,cumulative=False,bottom=None,histtype=‘bar’,align=‘mid’,orientation=‘vertical’,rwidth=None,log=False,color=None,label=None,stacked=False,normed=None,*,data=None,**kwargs)
参数说明:
返回值说明:
# 使用numpy随机生成200个数据
x_value = np.random.randint(120,180,300)
# 绘制直方图
plt.hist(x_value,bins=20,edgecolor='red')
plt.title('数据统计')
plt.xlabel('身高')
plt.ylabel('比率')
返回值:
num,bins,patches = plt.hist(x_value,bins=20,edgecolor='red')
print('num:',num)
print('bins:',bins)
for patche in patches:
print(patche)
取patches每个数组元素中的元素:
for p in patches:
print(p)
print(p.get_x()) # 取柱子左下角的横坐标
print(p.get_y()) # 取柱子左下角的纵坐标
print(p.get_width()) # 取柱子的宽度
print(p.get_height()) # 取柱子的高度
print(p.get_angle()) # 取柱子的角度
在直方图中,我们也可以添加折线图,辅助我们查看数据变化情况
import matplotlib.pyplot as plt
x_value = np.random.randint(120,180,300)
# 创建一个画布
fig,ax = plt.subplots()
# 绘制直方图
num,bins_limit,pat = plt.hist(x_value,bins=10,edgecolor='white')
# 注意num返回的个数是10,bins_limit返回的个数是11,需要截取
print(bins_limit[:10])
# 绘制折线图
ax.plot(bins_limit[:10],num,'--',marker='o')
一般的直方图都是等距的,但有时我们需要得到不等距的直方图,这个时候需要确定分组上下限,并指定histtype='bar’就可以了。
fig,ax = plt.subplots()
x = np.random.normal(100,20,100) # np.random.normal表示标准正态分布,均值=100,标准差=20,随机生成100个值
# 区间是:50-60,60-70,70-90,90-100,100-110,110-140,140-150
bins = [50,60,70,90,100,110,140,150] # 设置区间,区间数-1=直方图柱子数
ax.hist(x,bins,color='g',rwidth=0.9,edgecolor='white')
ax.set_title('不等距分组')
plt.show()
我们在使用直方图查看数据的频率时,有时候会查看多种类型数据出现的频率。
这时候我们可以以列表的形式传入多种数据给hist()方法的x数据。
# 指定分组个数
n_bins = 10
fig,ax = plt.subplots(figsize=(8,5))
# 分别生成10000,5000,2000个值
x_multi = [np.random.randn(n) for n in [10000,5000,2000]] # 列表表达式,生成的x_multi是一个三维数组
print(x_multi)
# 实际绘图代码与单类型直方图差异不大,只是增加了一个图例项
# 在 ax.hist函数中先指定图例label名称
ax.hist(x_multi,n_bins,histtype='bar',label=list('ABC'))
ax.set_title('多类型直方图')
ax.legend()
我们有时候会在同样数据范围情况下,对比两组不同对象群组收集的数据差异。
x_value = np.random.randint(140,180,200)
x2_value = np.random.randint(140,180,200)
plt.hist([x_value,x2_value],bins=10,stacked=True)
饼状图是用来显示一个数据系列,具体来说,饼状图显示一个数据系列中各项目占项目总和的百分比。
Matplotlib提供了一个pie()函数,该函数可以生成数组中数据的饼状图。可以使用x/sum(x)来计算各个扇形区域占饼状图总和的百分比。pie()函数的参数说明如下:
pyplot.pie(x,explode=None,labels=None,colors=None,autopct=None)
绘制饼图:
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
# 定义饼图的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
# 绘制饼图
# plt.pie(x,labels=labels,colors=['#FFDAB9','#FFE4E1','#00BFFF','#7FFFD4','#FFEC8B','#D8BFD8'],autopct='fmt%pct')
plt.pie(x,labels=labels)
百分比显示
autopct
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
# 定义饼图的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
# 绘制饼图
plt.pie(x,labels=labels,autopct='%.2f%%') # autopct中字符串的首尾为%,中间的.2f%表示百分比保留小数点后两位
运行结果:
饼状图的分离
explode:指定饼状图某些部分的突出显示
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
# 定义饼图的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
# 饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.01) # explode中的元素就代表饼图的对应部分距离圆心的距离
# 绘制饼图
plt.pie(x,labels=labels,explode=explode)
设置饼状图百分比和文本距离中心的距离
# 设置大小
plt.rcParams['figure.figsize'] = (5,5)
# 定义饼图的标签
labels = ['娱乐','育儿','饮食','房贷','交通','其他']
# 每个标签所占的数量
x = [200,500,1200,7000,200,900]
# 饼图分离
explode = (0.03,0.05,0.06,0.04,0.08,0.01) # explode中的元素就代表饼图的对应部分距离圆心的距离
# 绘制饼图
plt.pie(x,labels=labels,autopct='%.2f%%',explode=explode,pctdistance=1.2,labeldistance=1.4)
散点图scatter,散点图也叫X-Y图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间相互的影响程度,点的位置由变量的数值决定。
通过观察散点图上点的分布情况,我们可以推断出变量间的相关性。如果变量之间不存在相互关系,那么在散点图上就会表现为随机分布的离散的点,如果存在某种相关性,那么大部分的数据点就会相对密集并以某种趋势呈现。
数据的相关关系主要分为:正相关(两个变量值同时增长)、负相关(一个变量值增加另一个变量值下降)、不相关、线性相关、指数相关等,表现在散点图上的大致分布如下图所示。那些离点集群较远的点我们称为离群点或者异常点。
matplotlib.pyplot.scatter(x,y,s=None,c=None,marker=None,cmap=None,norm=None,vmin=None,vmax=None,alpha=None,linewidths=None,edgecolors=None,plotnonfinite=False,data=None,**kwargs)
以下实例scatter()函数接收长度相同的数组参数,一个是x轴的值,另一个是y轴的值。
# x轴数据
x = np.array([1,2,3,4,5,6,7,8])
# y轴数据
y = np.array([1,4,7,20,7,15,33,25])
# 绘制散点图
plt.scatter(x,y)
plt.show()
# x轴数据
x = np.array([1,2,3,4,5,6,7,8])
# y轴数据
y = np.array([1,4,7,20,7,15,33,25])
# 生成一个[0,1)之间的随机浮点数或N维浮点数组作为点的面积
s = (20*np.random.rand(8))**2
# 绘制散点图
plt.scatter(x,y,s)
plt.show()
颜色方式:
# x轴数据
x = np.random.rand(50) # 随机生成一维数组,其中有50个数
# y轴数据
y = np.random.rand(50)
# 生成一个[0,1)之间的随机浮点数或N维浮点数组
s = (10*np.random.rand(50))**2
# 颜色也可以使用一组数字序列
# 设置随机颜色
colors = np.random.rand(50)
# 绘制散点图
plt.scatter(x,y,s,alpha=0.5,c=colors)
plt.show()
颜色条 colormap
matplotlib模块提供了很多可用的颜色条,颜色条就像一个颜色列表,其中每一种颜色都有一个范围从0-100的值。下面是颜色条的例子:viridis。
# x轴数据
x = np.arange(1,101)
y = np.arange(1,101)
# 颜色随机
colors = np.arange(1,101)
plt.scatter(x,y,c=colors,cmap='viridis')
cmap主要分为以下四大类:
1.Sequential colormaps:连续化色图
2.Diverging colormaps:两端发散的色图
3.Qualitative colormap:离散化色图
4…Cyclic colormaps:周期图
保存图片 plplot.savefig()
savefig(fname,dpi=None,facecolor=‘w’,edgecolor=‘w’,orientation=‘portrait’,papertype=None,format=None,transparent=False,bbox_inches=None,pad_inches=0.1,frameon=None,metadata=None)
# x轴数据
x_axis = [1,4,9,16,25,36,49,64,81,100]
# y轴数据
y_axis = [1,2,3,4,5,6,7,8,9,10]
# 绘制图形
plt.plot(x_axis,y_axis)
# x轴和y轴标签
plt.xlabel('X')
plt.ylabel('Y')
plt.savefig('mytest.png')
plt.show()
注意:savefig()中第一个参数是保存的路径,如果路径中包含未创建的文件夹,需要手动或者使用os模块创建。必须在调用plt.show()之前保存图片,否则将保存的是空白图形。
使用os模块判断文件夹是否存在,不存在则创建文件夹:
import os
import matplotlib.pyplot as plt
# x轴数据
x_axis = [1,4,9,16,25,36,49,64,81,100]
# y轴数据
y_axis = [1,2,3,4,5,6,7,8,9,10]
# 绘制图形
plt.plot(x_axis,y_axis)
# x轴和y轴标签
plt.xlabel('X')
plt.ylabel('Y')
# 使用os目录判断文件夹是否存在:
if not os.path.exists('mypic'):
# 使用os模块创建文件夹
os.mkdir('mypic')
plt.savefig('mypic/mytest.png')
plt.show()
箱线图(Boxplot)是一种用作显示一组数据分散情况的统计图表。
箱线图,又称为箱型图(boxplot)或盒式图,不同于一般的折线图、柱状图或饼图等图表,其包含一些统计学的均值、分位数、极值
等统计量,该图信息量较大,不仅能够分析不同类别数据平均水平差异,还能揭示数据间的离散程度、异常值、分布差异
等。
在箱线图中,我们从上四分位数到下四分位数绘制一个盒子,然后用一条垂直触须(也称为‘盒须’)穿过盒子的中间。上垂线延伸至上边缘(最大值),下垂先延伸至下边缘(最小值)。
箱线图的应用场景:
函数的使用:
matplotlib.pyplot.boxplot(x,notch=None,sym=None,vert=None,whis=None,positions=None,widths=None,patch_artist=None,bootstrap=None,usermedians=NOne,conf_intervals=None,meanline=None,showmeans=None,showcaps=None,showbox=None,showfliers=None,boxprops=None,labels=None,3flierprops=None,medianprops=None,meanprops=None,capprops=None,whiskerprops=None,manage_ticks=True,autorange=False,zorder=None,*,data=None)
绘制箱线图:
import numpy as np
x = np.random.rand(20)
plt.boxplot(x,showmeans=True,meanline=True)
plt.grid()
plt.show()
词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息。
WordCloud:
WordCloud是一款python环境下的词云图工具包,同时支持python2和python3,能通过代码的形式把关键词数据转换成直观且有趣的图文模式。
安装方法:pip install wordcloud 或者 conda install -c conda-forge wordcloud
WordCloud( font_path=None,width=400, height=200,margin=2, ranks_only=None,prefer_horizontal=0.9,mask=None, scale=1,color_func=None, max_words=200,min_font_size=4,stopwords=None,random_state=None, background_color=‘black’,max_font_size=None,font_step=1,mode=‘RGB’,relative_scaling=‘auto’,regexp=None,collocations=True,colormap=None,normalize_plurals=True,contour_width=0, contour_color=‘black’,repeat=False,include_numbers=False,min_word_length=0,collocation_threshold=30,)
WordCloud参数说明:
属性 | 数据类型/默认值 | 解析 |
---|---|---|
font_path | string | 字体路径windows:C:/Windows/Fonts / Linux: /usr/share/fonts |
width | int (default=400) | 输出的画布宽度,默认为400像素 |
height | int (default=200) | 输出的画布高度,默认为200像素 |
prefer_horizontal | float (default=0.90) | 词语水平方向排版出现的频率,默认 0.9 所以词语垂直方向排版出现频率为0.1 |
mask | nd-array or None(default=None) | 如果参数为空,则使用二维遮罩绘制词云如果mask非空,设置的宽高值将被忽略遮罩形状被 mask 取代 |
scale | float (default=1) | 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍 |
min_font_size | int (default=4) | 显示的最小的字体大小 |
font_step | int (default=1) | 字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差 |
max_words | number (default=200) | 要显示的词的最大个数 |
stopwords | set of strings or None | 设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS |
background_color | color value default=”black” | 背景颜色,默认为黑色 |
max_font_size | int or Nonedefault=None | 显示的最大的字体大小 |
mode | string (default=”RGB”) | 当参数为“RGBA”并且background_color不为空时,背景为透明 |
relative_scaling | float (default=.5) | 词频和字体大小的关联性 |
color_func | callable, default=None | 生成新颜色的函数,如果为空,则使用 self.color_func |
regexp | string or None (optional) | 使用正则表达式分隔输入的文本 |
collocations | bool, default=True | 是否包括两个词的搭配 |
colormap | string or matplotlib colormapdefault=”viridis” | 给每个单词随机分配颜色,若指定color_func,则忽略该方法 |
random_state | int or None | 为每个单词返回一个PIL颜色 |
绘制词云图:
from wordcloud import WordCloud
with open('data.txt',encoding='utf-8') as file:
# 数据文件
txt = file.read()
# 如果数据文件中含有中文的话,font_path必须制定字体,否则中文会乱码
# collocations:是否包括两个词的搭配,默认为True,如果为True,会有重复数据
# width 幕布的宽度
# height 幕布的高度
# max_words 要显示的词的最大个数
# generate 读取文本文件
# 实例化词云图对象
wordcloud = WordCloud(font_path='C:/Windows/Fonts/simfang.ttf',collocations=False,background_color='white',width=800,height=600,max_words=50).generate(txt) # simfang.ttf是仿宋字体
# 生成图片
image = wordcloud.to_image()
# 展示图片
image.show()
# 保存文件
wordcloud.to_file('tag.jpg')
运行结果:
jieba分词:
pip install jieba
jieba分词的特点——支持三种分词模式:
jieba库的三种方法:
使用jieba库进行分词:
import jieba
seg_list = jieba.cut('我来到北京清华大学',cut_all=True)
print('Full Mode'+' '.join(seg_list)) # 全模式
seg_list = jieba.cut('我来到北京清华大学',cut_all=False)
print('Default Mode'+' '.join(seg_list)) # 精确模式
seg_list = jieba.cut('小明硕士毕业于中国科学院计算所,后在日本京都大学深造') # 默认模式
print(' '.join(seg_list)) # 精确模式
seg_list = jieba.cut_for_search('小明硕士毕业于中国科学院计算所,后在日本京都大学深造')
print(' '.join(seg_list)) # 精确模式
实例:先使用jieba库对文本进行分词,再使用WordCloud绘制词云图。
from wordcloud import WordCloud
import jieba
with open('data_zh.txt',encoding='utf-8') as file:
# 数据文件
txt = file.read()
txt_list = jieba.cut(txt,cut_all=False) # 返回的是一个列表对象
# 进行字符串拼接,用空格分隔切割好的词
txt_str = ' '.join(txt_list)
# 如果数据文件中含有中文的话,font_path必须制定字体,否则中文会乱码
# collocations:是否包括两个词的搭配,默认为True,如果为True,会有重复数据
# width 幕布的宽度
# height 幕布的高度
# max_words 要显示的词的最大个数
# generate 读取文本文件
# 实例化词云图对象
wordcloud = WordCloud(font_path='C:/Windows/Fonts/simfang.ttf',collocations=False,background_color='white',width=800,height=600,max_words=50).generate(txt_str) # simfang.ttf是仿宋字体
# 生成图片
image = wordcloud.to_image()
# 展示图片
image.show()
# 保存文件
wordcloud.to_file('tag_zh.jpg')
运行结果:
jieba.analyse的使用:提取关键字
注意:在使用jieba.analyse之前要通过import jieba.analyse 将其导入
使用jieba.analyse提取文本中的关键词
import jieba
import jieba.analyse
text = '不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑椹;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。单是周围的短短的泥墙根一带,就有无限趣味。油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑蝥,倘若用手指按住它的脊梁,便会拍的一声,从后窍喷出一阵烟雾。何首乌藤和木莲藤缠络着,木莲有莲房一般的果实,何首乌有拥肿的根。有人说,何首乌根是有象人形的,吃了便可以成仙,我于是常常拔它起来,牵连不断地拔起来,也曾因此弄坏了泥墙,却从来没有见过有一块根象人样。如果不怕刺,还可以摘到覆盆子,象小珊瑚珠攒成的小球,又酸又甜,色味都比桑椹要好得远。'
seg_list = jieba.analyse.extract_tags(text,allowPOS=('n')) # 提取文本中的名词
print('analyse extract allowPOS'+str(seg_list)) # 分析提取
运行结果:
使用jieba.analyse提取文本中的关键词并用WordCloud绘制词云图
import jieba
import jieba.analyse
from wordcloud import WordCloud
# text = '不必说碧绿的菜畦,光滑的石井栏,高大的皂荚树,紫红的桑椹;也不必说鸣蝉在树叶里长吟,肥胖的黄蜂伏在菜花上,轻捷的叫天子(云雀)忽然从草间直窜向云霄里去了。单是周围的短短的泥墙根一带,就有无限趣味。油蛉在这里低唱,蟋蟀们在这里弹琴。翻开断砖来,有时会遇见蜈蚣;还有斑蝥,倘若用手指按住它的脊梁,便会拍的一声,从后窍喷出一阵烟雾。何首乌藤和木莲藤缠络着,木莲有莲房一般的果实,何首乌有拥肿的根。有人说,何首乌根是有象人形的,吃了便可以成仙,我于是常常拔它起来,牵连不断地拔起来,也曾因此弄坏了泥墙,却从来没有见过有一块根象人样。如果不怕刺,还可以摘到覆盆子,象小珊瑚珠攒成的小球,又酸又甜,色味都比桑椹要好得远。'
# 读取文本文件
fp = open('data_zh.txt','r',encoding='utf-8')
text = fp.read()
fp.close()
# seg_list = jieba.analyse.extract_tags(text,allowPOS=('n')) # 提取文本中的名词
seg_list = jieba.analyse.extract_tags(text) # 不设定关键词
print('analyse extract allowPOS'+str(seg_list)) # 分析提取
print(len(seg_list))
# 将提取到的关键字列表拼接成字符串
seg_str = ' '.join(seg_list)
print(seg_str)
# 绘制词云图
wordcloud = WordCloud(font_path='C:/Windows/Fonts/simfang.ttf',collocations=False,background_color='white',width=800,height=600,max_words=50).generate(seg_str)
image = wordcloud.to_image()
image.show()