数据分析02

matplotlib基本要点
 

from matplotlib import pyplot as plt  #导入pyplot
x = range(2,26,2)
y = [15,13,14,5,17,20,25,26,26,24,22,18,15] 
# 数据在y轴的数据一起组成了所有要绘制出的坐标 
# x轴和y轴的数据一起组成了所有要绘制出的坐标 ,分别是(2,15),(4,13)...

# 设置图片大小
plt.figue(figsize=(20,8),dpi=80)

plt.plot(x,y)   ---传入x和Y,通过plot绘制折线图
# 设置x轴的刻度
plt.xticks(x) 
例子:
_xtick_labels = [i/2 for i in range(4.49)]
plt.xticks(_xtick_labels )

plt.xticks(x[::2])  --当刻度太密集时候使用列表的步长(间隔取值)来解决,matplotlib会自动帮我们对应
# 设置Y轴
ply.yticks(range(min(y),max(y)+1))

# 保存图片,可以保存为svg这种矢量图格式,放大不会有锯齿
plt.savefig("./t1.png")
plt.show()    ----在执行程序的时候展示图形

图片上可以完善的信息:
1.设置图片大小(高清无码大图) 
2.保存到本地
3.描述信息
4.调整x或y的刻度的问题
5.线条的样式
6.标记出特殊的点
7.给图片添加一个水印


# 绘制10-12 点的温度
from matplotlib import pyplot as plt
import random
x = range(0,120)    #range 是取不了步长的,只有列表能取步长
y = [random.randint(20,35)for i in range (120)]
plt.figue(fisize = (20,8),dpi = 80)
plt.plot(x,y)
plt.savefig("./ti.png")
plt.show()


设置显示中文:
# 设置x轴的刻度
_xtick_labels = ["10点{}分".format(i) for i in range(60)]
_xtick_labels += ["11点{}分".format(i) for i in range(60)]
# 取步长,数字和字符串一一对应,数字的长度一样 
plt.xtick(list(x)[::3],_xtick_labels[::3],rotation45)  #rotation为旋转的度数

matplotlib默认不支持中文字符,因为默认的英文字体无法显示汉字

查看linux/max下面支持的字体:
fc-list  ---查看支持的字体
fc-list :lang=zh  ---查看支持的中文(冒号前面有空格)

修改matplotlib默认字体:
matplotlib.rc (可能没有效果) 或  matplotlib 下有font_manager 

linux和windows设置字体的方式:
在开头还要添加 import matplotlib
font = {'family':'Miscrosoft YaHei','weight':'bold','size':'larger'}
matplotlib.rc("font",**font)

第二种:
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname"/system/Library/Fonts..(为路径)")
plt.xtick(list(x)[::3],_xtick_labels[::3],rotation45,fontpropertion = my_font)  

# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度 单位(C)",fontproperties=my_font)
plt.title("10点到12点每分钟的气温变化情况",fontproperties=my_font)


# 动手:女(男)朋友的数量
from matplotlib import pyplot as plt
from matplotlib import front_manager
x=range(11,31)
y=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
plt.plot(x,y)
my_font=font_manager.FontProperties(frame"路径")
_xtick_labels = ["{}岁".format(i) for i in x]
plt.xticks = (x,_xtick_labels,fontproperties=my_font)
plt.xlabel=("岁数",fontproperties=my_font)
plt.ylabel=("个数",fontproperties=my_font)
plt.title=("男女朋友数量走势",fontproperties=my_font)
plt.figue(figsize=(20,8),dpi=80)
# 绘制网格
plt.grid(alpha0.4)
plt.show()

#动手2
若是有两个人的
rom matplotlib import pyplot as plt
from matplotlib import front_manager
x=range(11,31)
y_1=[1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
y_2=[1,3,1,4,5,7,3,5,6,5,4,3,3,1,4,5,2,2,1,1]
plt.plot(x,y_1,label="自己",color="orange",linestyle='--',linewidth=5,)
plt.plot(x,y_2,label="同学",color="cyam")
my_font=font_manager.FontProperties(frame"路径")
_xtick_labels = ["{}岁".format(i) for i in x]1·
plt.xticks = (x,_xtick_labels,fontproperties=my_font)
plt.xlabel=("岁数",fontproperties=my_font)
plt.ylabel=("个数",fontproperties=my_font)
plt.title=("男女朋友数量走势",fontproperties=my_font)
plt.figue(figsize=(20,8),dpi=80)
# 绘制网格
plt.grid(alpha0.4)
# 添加图例(告诉哪条线指什么)
plt.legend(prop=my_font)  #此处中文显示不用fontproperties,而用prop
plt.show()

若有其他的折线图需求,则可以百度matplotlib里面--examples里面有很多种图形的代码



# 绘制散点图
温度和月份的散点图

from matplotlib import pyplot as plt
from matplotlib import font_manager

my_font = font_manager.fontproperties(frame"路径")
y_3 = [11,17,16,11,12,12,6,6,7,8,9,12,15,14,17,15,15,15,16,21,22,23]
y_10 = [26,25,26,24,24,25,23,17,19,18,17,16,25,14,14,17,13,15,,14,15]

x_3=range(1,32)
x_10=range(51,82)
# 设置图形的大小
plt.figue(figsize=(20,8),dpi=80)
# 和折线图的区别就这一点
plt.scatter(x_3,y_3,label="3月份")
plt.scatter(x_10,y_10,label="10月份")

# 调整X轴的刻度
_x=list(x_3)+list(x_10)
_xtick_labels=["3月{}日".format(i) for i in x_3]
_xtick_labels+=["10月{}日".format(i-50) for i in x_10]
plt.xtick(_x[::3],_xtick_labels[::3],fontproperties=my_font,rotation=45)
# 添加描述信息
plt.xlabel("时间",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
plt.title("标题",fontproperties=my_font)
# 添加图例
plt.legend(loc="upper left",prop=my_font)

plt.show()


# 绘制条形图 --电影对应相应的票房
有两种,一种是竖着,一种是横着
from matplotlib import pyplot as plt
from matplotlib import front_manager

my_font=front_maneger.FrontProperties(frame="/system/Library/Fonts")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5",....]
b = [56,75,45,36,35,65,11,12,34,67,23,74,.....]

#设置图形大小
plt.figue(figsize(20,15),dpi=80)
#绘制条形图
plt.bar(range(len(a)),b,width=0.3)
#设置字符串到x轴
plt.xticks(range(len(a)),a,fontproperties=my_font,rotation=90)

plt.savefig("./movie.png")
plt.show()

#绘制横着的条形图
from matplotlib import pyplot as plt
from matplotlib import front_manager

my_font=front_maneger.FrontProperties(frame="/system/Library/Fonts")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇","变形金刚5",....]
b = [56,75,45,36,35,65,11,12,34,67,23,74,.....]

#设置图形大小
plt.figue(figsize(20,8),dpi=80)
#绘制条形图
plt.barh(range(len(a)),b,height=0.3,color="orange")
#设置字符串到x轴
plt.yticks(range(len(a)),a,fontproperties=my_font,rotation=90)
plt.grid(alpha=0.3)
plt.savefig("./movie.png")
plt.show()


#比较三天的票房,先画出一天的,在将其余天的向右平移
from matplotlib import plot as plt
from matplotlib import frot_manager

my_font=front_maneger.FrontProperties(frame="/system/Library/Fonts")
a = ["战狼2","速度与激情8","功夫瑜伽","西游伏妖篇"]
b_16 = [24525,2353425,74774,2342]
b_15 = [24522,5464232,23424,34543]
b_14 = [23424,4562323,42353,254563]

bar_width =0.2
x_14=list(len(a))
x_15=[i+0.2 for i in x_14]
x_16=[i+0.4 for i in x_14]
#设置图形大小
plt.figue(figsize=(20,8),dpi=80)
#设置图例
plt.legend(prop=my_font)
#设置x轴的刻度
plt.xticks(x_15,a,frontproperties=my_font)
plt.bar(x_14,b_14,width=bar_width)
plt.bar(x_15,b_15,width=bar_width)
plt.bar(x_16,b_16,width=bar_width)

plt.show()


#绘制直方图
from matplotlib import plot as plt
from matplotlib import front_manager

a=[131,98,125,124,139,131,117,126,108,135...]
# 计算组数
d = 5
num_bins = (max(a)-min(a))//d
#设置x轴的刻度
plt.xticks(range(min(a),max(a)+d,d))
#设置图形的大小
plt.figue(figsize(20,8),dpi=10)
plt.hist(a,num_bins)
#若要求频率分布直方图,则在后边加上normod   plt.hist(a,num_bins,normod = True)
plt.grid()
plt.show() 

#不能绘制成直方图的数据
from matplotlib import pyplot as plt
interval = [0,5,10,15,20,25,30,35,40,45,60,90]
width = [5,5,5,5,5,5,5,5,5,15,30,60]
quantity = [836,2737,3723,3926,3596,1438,3273,642,824,613,215,47]
plt.figure(figsize(20,8),dpi=10)
plt.bar(range(12),quantity,width=1)
#设置x轴的刻度
_x=[i-0.5 for i in range(13)]
_xtick_labels = interval+[150]
plt.xticks(_x,_xtick_labels)

plt.grid()
plt.show()

matplotlib更多的图片样式:
http://matplotlib.org/gallery/index.html
plotly
echart
gallery
seaborn


numpy
#数组
import numpy as np
#使用Numpy生成数组
t1 = np.array([1,2,3])
print(t1)
print(type(t1))  #数据的类名是numpy.ndarray

t2 = np.array(range(10))
print(t2)

t3 = np.arange(4,10,2)
print(t3)

#numpy中的数据类型
t4 = np.array(range(1,4),dtype="float32")
print(t4)      #[1.2.3.]
print(t4.dtype)  #float64
#numoy中的bool类型
t5 = np.array([1,1,0,1,0,0],dtype=bool)
print(t5)   #[True Ture...]
print(t5.dtype)   #bool
#调整数据类型
t6=t5.astype("int8")
print(t6.dtype)   #int8
#修改浮点型的小数
np.round(d,2) #2的意思是保留两位小数

numpy.shape
>>> w.shape[0]
5
>>> w.shape[1]
6
w是一个5行6列的矩阵
w.shape[0]返回的是w的行数
w.shape[1]返回的是w的列数
numpy.reshape:函数功能:给予数组一个新的形状,而不改变它的数据

轴
一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴
#读取numpy数据
np.loadtxt(frame,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False)
delimiter 分隔字符串,默认是任何空格,可以改为逗号
skiprows 跳过前x行,一般跳过第一行表头
usecols  读取指定的列,索引,元组类型
unpack   如果True,读入属性将分别写入不同数组变量(行变成列)
dtype    默认情况下对于较大的数据会将其变为科学计数的方式

转置方法
t.transpose()
t.swapaxes(1,0)
t.T

numpy中索引和切片
#取行
print(t2[2])
#取连续的多行
print(t2[2:])
#取不连续的多行
print(t2[[2,8,10]])
print(t2[1,:])
print(t2[2:,:])
print(t2[[2,10,3],:])
#取列
print(t2[:,0])

#取连续的多列
#print(t2[:,2:])
#取不连续的多列
 print(t2[:,[0,2]])
#去行和列,取第3行,第四列的值
a = t2[2,3]
print(a)
print(type(a))

#取多行和多列,取第3行到第五行,第2列到第4列的结果
#去的是行和列交叉点的位置
b = t2[2:5,1:4]
print(b)
#取多个不相邻的点
#选出来的结果是(0,0) (2,1) (2,3)
c = t2[[0,2,2],[0,1,3]]
print(c)


#布尔索引
t[t>0]=10
#三元运算符
np.where(t<=10,0,10)
t<=10改为0,其余的作为10

t.clip(10,18)
小于10的改为10,大于18的改为18

nan是浮点类型

#出现nan
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
      当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)
inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷
inf也是浮点类型
两个nan是不相等的
#判断数组中nan的个数
np.count_nonzero(t!=t)
#判断一个数字是否为nan
t[np.isnan(t)]=0   把nan替换为0
nan和任何值计算都为nan
求和 t.sum(axis= )
均值 t.mean(axis=)
中值  np.median(axis=)
最大值 t.max(axis=)
最小值 t.min(axis=)
极值:np.ptp(axis=)
标准差:t.std(axis=)


#将数组中的nan换成均数
def fill_ndarray(t1)
import numpy as np
t1 = np.arange(12).reshape(3,4).astype("float")
t1[1,2:]=np.nan
for i in range(t1.shape[1])
     temp_col = t1[,i]
     nan_num = np.count_nonzero(temp_col!=temp_col)
     if nan_num !=0
          temp_not_nan_col = temp_col[temp_col = temp_col]
          temp_col[np.isnan(temp_col)]= temp_not_nan_col.mean()
return t1

if _name_ = '_main_'
t1=np.arange(16).reshape(4,4).astype("float")
t1[1, 2:] = np.nan
    print(t1)
    t1 = fill_ndarray(t1)
    print(t1)


动手操作,美国youtube评论数(直方图)
import numpy as np
from matplotlib import pyplot as plt
us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
t_us = np.loadtxt(us_file_path,delimiter=",",dtype="int")
t_us_comment= t_us[:,-1]
t_us_comment=t_us_comment[t_us_comment<=5000]
print(t_us_comment.max(),t_us_comment.min())
d=50
us_bins = (t_us_comment.max-t_us_comment.min)//d
plt.figure(figsize=(20,8),dpi=80)
plt.hist(t_us_comment,us_bins)
plt.show()

英国评论数和喜欢数的关系,散点图
import numpy as np
from matplotlib import pyplot as plt
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"
t_uk = np.loadtxt(us_file_path,delimiter=",",dtype="int")
t_uk=t_uk[t_uk[:,1]<=500000]
t_us_comment= t_uk[:,-1]
t_us_like=t_uk[:,1]
plt.figure(figsize=(20,8),dpi=80)
plt.scatter(t_uk_like,t_uk_commen
plt.show()

#数组的拼接
#竖直拼接
np.vstack((t1,t2))
#水平拼接
np.hstack((t1,t2))
#行交换
t[[1,2],:] = t[:,[2,0]]
#列交换
t[:,[1,2]] = t[:,[2,1]]


import numpy as np

us_data = "./youtube_video_data/US_video_data_numbers.csv"
uk_data = "./youtube_video_data/GB_video_data_numbers.csv"

#加载国家数据
us_data = np.loadtxt(us_data,delimiter=",",dtype=int)
uk_data = np.loadtxt(uk_data,delimiter=",",dtype=int)

# 添加国家信息
#构造全为0的数据
zeros_data = np.zeros((us_data.shape[0],1)).astype(int)
ones_data = np.ones((uk_data.shape[0],1)).astype(int)

#分别添加一列全为0,1的数组
us_data = np.hstack((us_data,zeros_data))
uk_data = np.hstack((uk_data,ones_data))


# 拼接两组数据
final_data = np.vstack((us_data,uk_data))
print(final_data)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值