Python数据分析
Posted 雨宙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据分析相关的知识,希望对你有一定的参考价值。
Python数据分析(六)
打卡第十天啦!!!
Matplotlib库(一)
数据分析中的常用图剖析
- 折线图:折线图用于显示数据在一个连续的时间间隔或者时间跨度上的变化,它的特点是反映事物随时间或有序类别而变化的趋势。
- 柱状图:典型的柱状图(又名条形图),使用垂直或水平的柱子显示类别之间的数值比较。其中一个轴表示需要对比的分类,另一个轴代表相应的数值。
- 直方图:直方图(Histogram),又称质量分布图,是一种统计报告图,由一系列高度不等的条纹表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。直方图是数值数据分布的精确图形表示。为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。这些值通常被指定为连续的,不重叠的变量间隔。间隔必须相邻,并且通常是(但不是必须的)相等的大小。
- 散点图:散点图也叫 X-Y 图,它将所有的数据以点的形式展现在直角坐标系上,以显示变量之间的相互影响程度,点的位置由变量的数值决定。
- 饼状图:饼状图通常用来描述量、频率和百分比之间的关系。在饼图中,每个扇区的弧长大小为其所表示的数量的比例。
- 箱线图:箱线图(Box-plot)又称为盒须图、盒式图或箱型图,是一种用作显示一组数据分散情况资料的统计图。
Matplotlib基本使用
- plt.plot可以只传Y轴的值,如果只传Y轴的值,那么X轴就会默认使用range(0,Y的长度)
y = [np.random.randint(0,10) for x in range(10)]
plt.plot(y)
2. plt.plot的x和y参数不能作为关键字参数来传递,只能作为位置参数来传
y = [np.random.randint(0,10) for x in range(10)]
x = range(10)
plt.plot(x,y)
- plt.plot中的data参数可以为一个字典或者DataFrame对象,然后在x和y上指定这个列的名字,那么plot会自动读取,注:因为x、y、fmt都是在前面,所以如果只传x和y,那么可能会产生歧义,这时候我们可以多传一个空的参数作为fmt的参数,就不会有警告了
mydata =
'a':range(10),
'b':[np.random.randint(0,10) for x in range(10)]
plt.plot('a','b','',data=mydata)
mydf = pd.DataFrame(data=mydata)
plt.plot('a','b','',data=mydf)
- plt.plot的fmt参数可以设置线条的样式以及颜色
mydf = pd.DataFrame(data=mydata)
plt.plot('a','b','--',data=mydf)
mydf = pd.DataFrame(data=mydata)
plt.plot('a','b','ob',data=mydf)
- plt.plot的color参数可以使用字母、十六进制,或者是RGBA的方式来设置颜色
mydf = pd.DataFrame(data=mydata)
plt.plot('a','b','',data=mydf,color='#893f23')
mydf = pd.DataFrame(data=mydata)
plt.plot('a','b','',data=mydf,color=(0.2,0.4,0.1,1))
设置折线图的线条样式
- 使用plot绘图的时候,就可以传递Line2D的属性值进去,来修改线条的样式
y = [np.random.randint(0,10) for x in range(10)]
plt.plot(y,linewidth=4)
- 使用plot返回的线条,单独去设置也可以,但是单独设置的时候,是通过set_Line2D属性名()的方式来设置的
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
lines = plt.plot(range(10),y1,range(10),y2)
print(lines)
line = lines[0]
line.set_color('r')
line.set_linewidth(4)
line.set_alpha(0.1)
- 使用plt.setp来一次性设置多个线条的样式
y1 = [np.random.randint(0,10) for x in range(10)]
y2 = [np.random.randint(0,10) for x in range(10)]
lines = plt.plot(range(10),y1,range(10),y2)
plt.setp(lines,linewidth=4)
设置图标题和显示中文
- 设置标题:可以通过plt.title方法来实现。
- 默认plot是不支持中文的,如果想要支持中文,那么应该创建一个字体对象matplotlib.font_manager.FontProperties,然后指定fname参数,需要具体的路径,这里还需要注意,拷贝出来的字体的字符串,前面有一个乱码,需要把乱码删掉
y = [np.random.randint(10) for a in range(10)]
font = font_manager.FontProperties(fname=r"C:\\\\Windows\\\\Fonts\\\\simsun.ttc",size=15)
plt.plot(y)
plt.title('折线图',fontproperties=font)
设置轴刻度和文本显示
- 刻度是通过xticks和yticks来设置的,xticks和yticks需要传递两个参数,第一个参数ticks不重要,只要跟数据量保持一致就可以了,比如有20个数据,那么只要产生20个数据的数组或者列表都可以,第二个参数labels是用来设置每个刻度上的文本显示,这个比较重要
- 轴的名称是通过xlabel和ylabel来设置的
avenger = [17974.4,50918.4,30033.0,40329.1,52330.2,19833.3,11902.0,24322.6,47521.8,32262.0,22841.9,12938.7,4835.1,3118.1,2570.9,2267.9,1902.8,2548.9,5046.6,3600.8]
plt.figure(figsize=(15,5))
plt.plot(avenger,marker="o")
font.set_size(10)
plt.xticks(range(20),["%d"%x for x in range(1,21)],fontproperties=font)
plt.xlabel("天数",fontproperties=font)
plt.ylabel("票房数(万)",fontproperties=font)
plt.grid()
设置marker和注释文本
- 使用plt.plot的时候,可以通过marker参数设置坐标点的样式。markerfaceoolor代表的是点的颜色,markeredgeolor代表的是点的边界的颜色,markersize代表的是点的大小。
- plt.anotate(text, xy, xytext, arrowprops)是用来做文本注释的,text代表的是需要注释的文本,xy代表的是需要注释的坐标点,xytext代表的是文本的致标点,arrowprops代表的是箭头的一些属性。
plt.plot(np.sin(np.arange(20)),marker='o')
print(np.sin(np.arange(20)))
# plt.annotate("(0,0)",xy=(0,0),xytext=(-0.5,-0.8),arrowprops='width':2,'headwidth':16,'headlength':20)
for index,value in enumerate(np.sin(np.arange(20))):
plt.annotate("(%d,%.2f)"%(index,value),xy=(index,value),xytext=(index-0.1,value-0.1))
画板样式设置和保存图片
- 画板的样式:通过调用plt.figure来实现,这个函数调用必须要在所有绘图之前来完成,参数解释:
(1)figsize:画板的尺寸,是一个元组,第一个参数是宽度,第二个参数是高度,单位是英寸
(2)facecolor:画板颜色,注意区分Axes的背景颜色
(3)edgecolor:边框颜色,边框默认的宽度是0,因此如果想要看到边框,那么需要设置linewidth
(4)dpi:像素,也就是一个英寸中的像素点,默认是100
plt.figure(figsize=(10,5),facecolor='r',edgecolor='k',linewidth=2,dpi=80)
plt.plot(np.arange(5,10))
- 保存图片
(1)plt.savefig
(2)右键保存
plt.savefig("C:\\\\Users\\\\Rainy_Universe\\\\Desktop\\\\abc.png")
绘制多个子图和matplotlib
- 如果想要在一个图上绘制多根折线,那么直接在plot中传递多个x和y就可以了,或者调用多次plot方法就可以了
x = np.linspace(0,20)
plt.plot(x,np.sin(x),x,np.cos(x))
x = np.linspace(0,20)
plt.plot(x,np.sin(x))
plt.plot(x,np.cos(x))
- 如果想要在一个画板上绘制多个子图(Axes对象),那么可以使用plt.subplot或plt.subplots方法
- plt.subplot:plt.subplot(221),第一个数字代表行,第二个数字代表列,第三个数字代表当前第几个子图,使用subplot绘制的所有东西都是在当前子图上,直到出现了新的subplot
plt.subplot(221)
plt.plot(np.arange(20))
plt.plot(np.arange(20)**2)
plt.subplot(222)
plt.plot(np.sin(np.arange(20)),'r')
plt.subplot(223)
plt.plot(np.cos(np.arange(20)),'b')
plt.subplot(224)
plt.plot(np.tan(np.arange(20)),'y')
- plt.subplots:figure,axes = plt.subplots(2,2),第一个代表行,第二个代表列,这个方法是一次性把所有的子图都绘制了,但是在子图上没有任何的东西,我们需要使用它的返回值来绘制,axes就是子图的对象
figure,axes = plt.subplots(2,2)
plt.style.use('ggplot')
axes[0,0].plot(np.arange(20),c='g')
axes[0,1].plot(np.sin(np.arange(20)),c='r')
axes[1,0].plot(np.cos(np.arange(20)),c='b')
axes[1,1].plot(np.tan(np.arange(20)),c='y')
Matplotlib库(二)
条形图
垂直条形图的绘制
- 绘制条形图使用的是plt.bar方法,这个方法有很多参数:
(1)x:在x轴上的坐标,可以为一个列表/数组/字符串
(2)y:在y轴上的坐标,可以为一个列表/数组/字符串
(3)data:如果传递了data,那么x和y就可以为data中的key和value,比如data是一个dataframe对象,那么x和y就是这个dataframe对象的某个列的名字
from matplotlib import font_manager
movies =
"流浪地球":40.78,
"飞驰人生":15.77,
"疯狂的外星人":20.83,
"新喜剧之王":6.10,
"廉政风云":1.10,
"神探蒲松龄":1.49,
"小猪佩奇过大年":1.22,
"熊出没·原始时代":6.71
font = font_manager.FontProperties(fname=r"C:\\\\Windows\\\\Fonts\\\\simsun.ttc",size=12)
plt.rcParams['font.sans-serif'] = ['SimSun']
x = list(movies.keys())
y = list(movies.values())
plt.figure(figsize=(15,5))
# 传x和y
plt.bar(x,y,width=-0.4,align='edge',color='r',edgecolor='k')
plt.xticks(font_properties=font)
plt.yticks(range(0,45,5),["%d亿元"%x for x in range(0,45,5)],font_properties=font)
# 传data
movie_df = pd.DataFrame(data="names":list(movies.keys()),"tickets":list(movies.values()))
plt.bar("names","tickets",data=movie_df)
横向条形图的绘制
- 横向条形图:plt.barh,在方法中,y代表的是之前bar中的x,width代表的是bar中的height
plt.barh(list(movies.keys()),list(movies.values()))
分组条形图的绘制
- matplotlib没有提供专门的分组条形图的API来实现,而是需要设置坐标来实现,绘制的规则是,一次性绘制所有电影第一天的数据,然后是第二天…
movies =
"流浪地球":[2.01,4.59,7.99,11.83,16],
"飞驰人生":[3.19,5.08,6.73,8.10,9.35],
"疯狂的外星人":[4.07,6.92,9.30,11.29,13.03],
"新喜剧之王":[2.72,3.79,4.45,4.83,5.11],
"廉政风云":[0.56,0.74,0.83,0.88,0.92],
"神探蒲松龄":[0.66,0.95,1.10,1.17,1.23],
"小猪佩奇过大年":[0.58,0.81,0.94,1.01,1.07],
"熊出没·原始时代":[1.13,1.96,2.73,3.42,4.05]
plt.figure(figsize=(20,8))
width = 0.75
bin_width = width/5
movie_pd = pd.DataFrame(movies)
ind = np.arange(0,len(movies))
# 第一种方案
# first_day = movie_pd.iloc[0]
# plt.bar(ind-bin_width*2,first_day,width=bin_width,label='第一天')
# second_day = movie_pd.iloc[1]
# plt.bar(ind-bin_width,second_day,width=bin_width,label='第二天')
# third_day = movie_pd.iloc[2]
# plt.bar(ind,third_day,width=bin_width,label='第三天')
# four_day = movie_pd.iloc[3]
# plt.bar(ind+bin_width,four_day,width=bin_width,label='第四天')
# five_day = movie_pd.iloc[4]
# plt.bar(ind+bin_width*2,five_day,width=bin_width,label='第五天')
# 第二种方案
for index in movie_pd.index:
day_tickets = movie_pd.iloc[index]
xs = ind-(bin_width*(2-index))
plt.bar(xs,day_tickets,width=bin_width,label="第%d天"%(index+1))
for ticket,x in zip(day_tickets,xs):
plt.annotate(ticket,xy=(x,ticket),xytext=(x-0.1,ticket+0.1))
# 设置图例
plt.legend(prop=font)
plt.ylabel("单位:亿",fontproperties=font)
plt.title("春节前5天电影票房记录",fontproperties=font)
# 设置x轴的坐标
plt.xticks(ind,movie_pd.columns,fontproperties=font)
plt.xlim
plt.grid(True)
plt.show()
堆叠条形图的绘制
- matplotlib没有提供专门的堆叠条形图的API来实现,我们在绘制往上堆叠数据的时候,可以使用bottom参数,来往上偏移指定的距离,这样就可以实现堆叠的效果
menMeans = (20, 35, 30, 35, 27)
womenMeans = (25, 32, 34, 20, 25)
groupNames = ('G1','G2','G3','G4','G5')
xs = np.arange(len(menMeans))
plt.bar(xs,menMeans)
plt.bar(xs,womenMeans,bottom=menMeans)
plt.xticks(xs,groupNames)
plt.show()
直方图
直方图的绘制
- 直方图的绘制方法,使用的是plt.hist方法来实现,这个方法的参数以及返回值如下:
参数:
(1)x:数组或者可以循环的序列。直方图将会从这组数据中进行分组。
(2)bins:数字或者序列(数组/列表等)。如果是数字,代表的是要分成多少组。如果是序列,那么就会按照序列中指定的值进行分组。比如[1,2,3,4],那么分组的时候会按照三个区间分成3组,分别是[1,2)/[2,3)/[3,4]。
(3)range:元组或者None,如果为元组,那么指定x划分区间的最大值和最小值。如果bins是一个序列,那么range没有有没有设置没有任何影响。
(4)density:默认是False,如果等于True,那么将会使用频率分布直方图。每个条形表示的不是个数,而是频以上是关于Python数据分析的主要内容,如果未能解决你的问题,请参考以下文章