文章目录

  • 前提工作
  • twinx() —— 双轴图(折线图+柱状图)的绘制
  • plt.scatter() —— 散点图的绘制
  • plt.boxplot() —— 箱形图的绘制
  • seaborn.heatmap() —— 热力图(相关系数矩阵图)
  • 夹带私货
  • 总结



  


  

前提工作

  

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

import warnings
warnings.filterwarnings('ignore')    # 去掉警告

plt.rcParams['font.sans-serif'] = ['SimHei']    # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False    # 确保负号正常显示


df = pd.read_excel(r'D:\数据分析\movie_data3.xlsx')

  
  
  
  

twinx() —— 双轴图(折线图+柱状图)的绘制

  

所谓双轴图,其实就是双y轴图,即一个图有两个y轴。

既然y轴都有两个了,理所当然双轴图中的图也有两个。一个图定位坐标时看左边y轴,另一个看右边y轴。

双轴图并不固定里面两个图的类型,可以 折线图+柱状图 ,也可以 两个折线图,随心所欲。目前双轴图支持的展示类型柱形图、折线图、堆积柱形图、面积图这四类图表样式。
不过一般来说是 折线图+柱状图。

  

要实现双轴操作,就要用到 twinx() 函数了。

  

根据电影评分绘制电影数量和评分的频率分布双轴图

  • x轴:评分
  • 图左边的y轴:表示电影数量
  • 图右边的y轴:表示概率分布

  
生成概率密度函数,需要导包

from scipy.stats import norm
fig = plt.figure(figsize = (10,8))

# 1.生成频率分布直方图
ax1 = fig.add_subplot(111)
n,bins,patches = ax1.hist(df['评分'],bins = 100,alpha = 0.7)

ax1.set_xlabel('评分',fontsize = 15)
ax1.set_ylabel('电影数量',fontsize = 15)
ax1.set_title('频率分布图',fontsize = 20)


# 2.生成绘制曲线图用的正态分布概率密度函数

# scipy.stats.norm函数 : 可以实现正态分布
# pdf函数 : 生成概率密度函数(概率论学的那)
# 上面两个合起来  norm.pdf : 生成正态分布概率密度函数

# 此时我们需要一个均值(μ)为评分的均值,方差(σ²)为评分的标准差这样一个正态分布概率密度函数
y = norm.pdf(bins,df['评分'].mean(),df['评分'].std())    
# 第一个参数是前面hist函数的返回值   第二个参数:均值   第三个参数:方差


# 3.生成曲线图
ax2 = ax1.twinx()    # ax2与ax1共用一个x轴
ax2.plot(bins,y,'y--')    # 为了打造双轴图,就得把y绘制到图形中
ax2.set_ylabel('评分的概率分布',fontsize = 15)

python画双Y轴坐标 python绘制双坐标图_数据分析

PS:这看起来怪麻烦,其实不然,只是举的这个例子难了,因为曲线是拿正态分布概率密度函数画的。概率论学的。
  

简单来说,双轴图画法就是在画两个图的基础上加上了 twinx() 操作。即,一个图上画两种图案,这两两个图案用 twinx() 联系起来。这样好理解多了。

  
  
  
  

plt.scatter() —— 散点图的绘制

  

两组数据构成多个坐标点,考察坐标点的分布,判断两变量之间是否存在某种关联或总结坐标点的分布模式。

散点图将序列显示为一组点。值由点在图表中的位置表示。类别由图表中的不同标记表示。散点图通常用于比较跨类别的聚合数据。

  

根据电影时长和电影评分绘制散点图

x = df.时长
y = df.评分

plt.figure(figsize = (10,8))
plt.scatter(x,y)
plt.title('电影时长与评分的散点图',fontsize = 20)
plt.xlabel('时长',fontsize = 18)
plt.ylabel('时长',fontsize = 18)
plt.tick_params(labelsize = 14)    # 坐标轴上字体大小

python画双Y轴坐标 python绘制双坐标图_数据挖掘_02


  

这样绘制的图有个问题,由于数据量过大,所以画出来的图非常冗余难看。

  

改进:

提取原有数据的 百分之一

x = df.时长[::100]
y = df.评分[::100]

只需把 x,y 数据每隔 100 个提取一次即可,这样就能得到原有数据的 百分之一

下面的代码不变

python画双Y轴坐标 python绘制双坐标图_数据_03

  

绘制图形时,在 plt.scatter() 中还可以加color参数设置点的颜色和 maker 参数设置点的 形状
  

marker 属性:

设置散点的形状

marker

形状

‘.’


‘,’

像素点

‘o’


‘v’

倒三角点

‘^’

上三角点

‘<’

左三角点

‘>’

右三角点

‘1’

下三叉点

‘2’

上三叉点

‘3’

左三叉点

‘4’

右三叉点

‘8’

八角形点

‘s’

正方形点

‘p’

五角点

‘*’

星星点

‘h’

六边形点1

‘H’

六边形点2

‘+’

加号点

‘x’

乘号点

‘D’

钻石

‘d’

细钻

‘|’

v线

‘_’

H线

  
绘图时就利用marker属性设置散点形状

plt.scatter(x,y,color = 'b',marker = 'D')

  
  
  
  

plt.boxplot() —— 箱形图的绘制

  

箱型图是一种用作显示一组数据分散情况资料的统计图。因形状如箱子而得名。在各种领域也经常被使用,常见于品质管理。它主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较。箱线图的绘制方式是:先找出一组数据的中位数、两个四分位数、上下边缘线;然后,连接两个四分位数画出箱子;再将上下边缘线与箱子连接,中位数在箱子中间。

  

plt.boxplot() 的参数:

  • x :指定要绘制箱形图的数据。
  • sym :指定异常的形状,默认为 +号 显示。
  • labels :图例,添加标签。
  • whis :指定上下须与上下四分位的位置,默认为1.5倍的四分位差。指定异常值的范围,大代表宽松;小代表,紧。
  • flierprops :设置异常值的属性,如异常点的形状、大小、填充色等。
  • notch :是否是凹⼝的形式展现箱线图,默认⾮凹⼝。
  • vert :箱形图如何摆放,横着还是竖着,默认垂直摆放。
  • positions :指定箱线图的位置,默认为[0,1,2…]。
  • widths :指定箱线图的宽度,默认为0。
  • patch_artist :是否填充箱体的颜⾊。
  • meanline :是否用线的形式表示均值,默认用点来表示。
  • meanprops :设置均值的属性,如点的⼤⼩、颜⾊等。
  • capprops :设置箱线图顶端和末端线条的属性,如颜⾊、粗细等。
  • whiskerprops :设置须的属性,如颜⾊、粗细、线的类型等。

  

美国电影评分的箱形图

plt.figure(figsize = (10,6))
plt.boxplot(data,whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})
# flierprops —— 异常值属性设置。   markerfacecolor 填充色    color 边框线    patch_artist 箱体颜色是否能修改
# boxprops —— 填充箱体颜色。  color 外边框线    facecolor 填充色    

plt.title('美国电影评分',fontsize = 20)

plt.show()

python画双Y轴坐标 python绘制双坐标图_数据分析_04

  

多组数据的箱形图

把多个数据都放在一个箱形图中,进行并列展示,然后进行各种数据间的比较。

data1 = df[df.产地 == '中国大陆']['评分']
data2 = df[df.产地 == '日本']['评分']
data3 = df[df.产地 == '中国香港']['评分']
data4 = df[df.产地 == '英国']['评分']
data5 = df[df.产地 == '法国']['评分']

plt.figure(figsize = (12,8))
plt.boxplot([data1,data2,data3,data4,data5],labels = ['中国大陆','日本','中国香港','英国','法国'],whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})
plt.title('电影评分',fontsize = 20)
plt.tick_params(labelsize = 14)    # 坐标轴上字体大小

# 设置坐标轴的颜色
ax = plt.gca()    # gca : 得到当前的坐标系
ax.patch.set_facecolor('gray')
ax.patch.set_alpha(0.2)

plt.show()

python画双Y轴坐标 python绘制双坐标图_数据分析_05

  

通过 vert 属性可以把图旋转

构造箱形图时,plt.boxplot 中加个 vert 属性即可

plt.boxplot([data1,data2,data3,data4,data5],vert = False,labels = ['中国大陆','日本','中国香港','英国','法国'],whis = 2,flierprops = {'marker':'o','markerfacecolor':'r','color':'k'},patch_artist = True,boxprops = {'color':'k','facecolor':'#9999ff'})

其他代码不变

python画双Y轴坐标 python绘制双坐标图_数据_06

  
  
  
  

seaborn.heatmap() —— 热力图(相关系数矩阵图)

  

seaborn 是一个精简的python库,可以创建具有统计意义的图表,能理解pandas的DataFrame类型。

  

seaborn.heatmap 参数:
  

(1)热力图输入数据参数:

  • data :矩阵数据集,可以是numpy的数组(array),也可以是pandas的DataFrame。如果是DataFrame,则 df 的 index/column 信息会分别对应到 heatmap 的 columns 和 rows,即 pt.index 是热力图的行标,pt.columns 是热力图的列标。
      

(2)热力图矩阵块颜色参数:

  • vmax,vmin :分别是热力图的颜色取值最大和最小范围,默认是根据data数据表里的取值确定。
  • cmap :从数字到色彩空间的映射,取值是 matplotlib 包里的 colormap 名称或颜色对象,或者表示颜色的列表。
  • center :改参数默认值。如果数据表取值有差异时,设置热力图的色彩中心对齐值;能调整生成的图像颜色的整体深浅;设置 center 数据时,如果有数据溢出,则手动设置的 vmax、vmin 会自动改变 robust,默认为False。
      

(3)热力图矩阵块注释参数:

  • annot :默认False。如果是True,在热力图每个方格写入数据;如果是矩阵,在热力图每个方格写入该矩阵对应位置数据。
  • fmt :字符串格式代码,矩阵上标识数字的数据格式,比如保留小数点后几位数字。
  • annot_kws :默认False。如果是True,设置热力图矩阵上数字的大小颜色字体,matplotlib包text类下的字体设置。
      

(4)热力图矩阵块之间间隔及间隔线参数:

  • linewidths :定义热力图里 “标识两两特征关系的矩阵小块”之间的间隔大小。
  • linecolor :切分热力图上每个小块的线的颜色,默认值是 ‘white’。
      

(5)热力图颜色刻度条参数:

  • cbar :是否在热力图侧边绘制颜色刻度条,默认是True。
  • cbar_kws :热力图侧边绘制颜色刻度条时,相关字体设置,默认值是None。
  • cbar_ax :热力图侧边绘制颜色刻度条时,刻度条位置设置,默认值是None。

  

求投票人数,评分,时长 ,这三个属性间的相关系数矩阵图

# 把这三列取出来
data = df[['投票人数','评分','时长']]

python画双Y轴坐标 python绘制双坐标图_数据分析_07


  

先导入:

import seaborn as sns

求参数:

corr = data.corr()    # 求相关系数
corr = abs(corr)      # 不想考虑正相关还是负相关,只想考虑相关程度

python画双Y轴坐标 python绘制双坐标图_数据分析_08

绘图:

fig = plt.figure(figsize = (10,8))
ax = fig.add_subplot(1,1,1)

ax = sns.heatmap(corr,annot = True,annot_kws = {'size':13,'weight':'bold'},linewidths = 0.05)

plt.xticks(fontsize = 15)    # 设置x轴字体大小
plt.yticks(fontsize = 15)    # 设置y轴字体大小
# 等同于
# plt.tick_params(labelsize = 14)    # 坐标轴上字体大小

python画双Y轴坐标 python绘制双坐标图_python画双Y轴坐标_09

  

  

pandas 本身也封装了画图函数

我们可以画出各个属性之间的散点图,对角线是分布图

data = df[['投票人数','评分','时长']]

%pylab inline
result = pd.plotting.scatter_matrix(data[::100],diagonal = 'kde',color = 'k',alpha = 0.2,figsize = (10,10))
# diagonal 对角线设置

python画双Y轴坐标 python绘制双坐标图_数据分析_10

  
  
  
  

夹带私货

  

各电影评价人数柱状图

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import warnings

warnings.filterwarnings('ignore')  # 去掉警告

plt.rcParams['font.sans-serif'] = ['SimHei']  # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False  # 确保负号正常显示


# 各电影评价人数柱状图

df = pd.read_csv(r'D:\pro1\实战案例\douban.csv')
df = df[['片名', '评价人数']]

plt.figure(figsize=(10, 6))
plt.bar(df.片名, df.评价人数)
plt.title('各电影评价人数', fontsize=20)   # 设置图的标题(fontsize是字体大小)
plt.xlabel('电影', fontsize=18)   # x轴名字
plt.ylabel('评价人数', fontsize=18)     # y轴名字
plt.tick_params(labelsize=12)   # 坐标轴上字体大小
plt.xticks(rotation=90)     # 把字旋转多少度。x轴上的字都挤在一起了,把字竖着写

# 把数字显示在柱上(每个柱子都显示就得用循环)
for a, b in zip(df.片名, df.评价人数):
    plt.text(a, b + 30000, b, ha='center', fontsize=10, va='bottom')

plt.show()

python画双Y轴坐标 python绘制双坐标图_python_11

  

各电影评价人数和评分情况双轴图

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

import warnings

warnings.filterwarnings('ignore')  # 去掉警告

plt.rcParams['font.sans-serif'] = ['SimHei']  # 确保中文正常显示
plt.rcParams['axes.unicode_minus'] = False  # 确保负号正常显示

# 各电影评价人数和评分情况双轴图

df = pd.read_csv(r'D:\pro1\实战案例\douban.csv')
df = df[['片名', '评价人数', '评分']]

fig = plt.figure(figsize=(10, 6))
ax1 = fig.add_subplot(111)
ax1.bar(df.片名, df.评价人数, alpha=0.7)
ax1.set_title('各电影评价人数和评分情况', fontsize=20)  # 设置图的标题(fontsize是字体大小)
ax1.set_xlabel('电影', fontsize=18)  # x轴名字
ax1.set_ylabel('评价人数', fontsize=18)  # y轴名字
ax1.tick_params(labelsize=14)  # 坐标轴上字体大小
plt.xticks(rotation=90)  # 把字旋转多少度。x轴上的字都挤在一起了,把字竖着写

ax2 = ax1.twinx()
ax2.plot(df.片名, df.评分, 'y')
ax2.set_ylabel('评分', fontsize=18)

plt.show()

python画双Y轴坐标 python绘制双坐标图_python画双Y轴坐标_12

  
  
  
  

总结

  

暑假在家里花了一个星期时间,把numpy、pandas和matplotlib这三个数据分析库做了个大致的了解,目前对于Python数据分析的学习暂时告一段落了。接下来一段时间要继续Java的学习,并且在6月底吧,开始学数学建模的一些算法,因为听说学校会在6月底给参加建模的学生培训。

学到这里时其实挺感慨的,因为这个暑假是我人生中唯一一个开始认真学习的假期,哪怕是高二的暑假,我也没有像现在这样努力。每天早上8点坐到书桌上,一坐就是晚上12点或1点,目前已经坚持一个星期了,因为暑假才放了一个星期嘛哈哈。真不可思议,我现在能克制住所有欲望在假期里专注学习,这是我之前任何时候都不敢想的,希望一直保持下去吧。如果这个暑假每一天都能利用好,我相信我距离大厂又会更进一步。

还有一点让我欣慰,就是之前一个大佬,我就直接指名道姓吧哈哈,就是铁甲小宝大佬帮助我面试讲师的时候,给了我一些他的项目,其中有爬虫和豆瓣影评可视化。当时我看了这些项目时,表示啥也看不懂,但为了能面试上某教育机构的讲师,我硬着头皮说这些是我做的项目。彼时,我连Python基础都不好,连个简单的管理系统都写不出来,更别提会这些了,我连听都没听说过!还记得他跟我说爬虫的时候,我还以为他在逗我,我根本想不到爬虫竟然是一个技术的名字,我还反复跟他确认那个项目叫啥?叫爬虫?离谱的名字! 额额 现在看之前的自己太蠢了。现在算是今非昔比了,爬虫项目我早就做了,豆瓣影评可视化就是上面的“夹带私货” 哈哈。我用了不同的方法做的,并且也对图做了一些改进,肯定要比他给我的要好看许多了,哈哈并没有说大佬不好的意思。

我也在慢慢进步,从最早的3月份小菜鸡,到现在6月份小菜鸟,进行了从鸡到鸟的飞翔蜕变。哈哈开玩笑的。3个月时间,我学了不少东西,不过这是次要的。最重要的是3个月时间,让我对于未来不再迷茫了,至少不会像之前那样不知道该干啥。

努力坚持住,目前大二暑假,还有两年毕业,这两年利用好,我今后的人生可能都会变得不一样,加油吧骚年!

现在凌晨快1点了,属实是网易云时间到了,不能再写这有的没的了,明天还要继续干活呢,下播了兄弟们!