Python作图

matplotlib 是Python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地行制图。而且也可以方便地将它作为绘图控件,嵌入GUI应用程序中。
matplotlib官方查询网址
Matplotlib 里的常用类的包含关系为Figure -> Axes -> (Line2D, Text, etc.)一个Figure对象可以包含多个子图(Axes),在matplotlib中用Axes对象表示一个绘图区域,可以理解为子图。
可以使用subplot()快速绘制包含多个子图的图表,它的调用形式如下:
subplot(numRows, numCols, plotNum)
subplot将整个绘图区域等分为numRows行* numCols列个子区域,然后按照从左到右,从上到下的顺序对每个子区域进行编号。

面向对象的Plot代码如下:
import pandas as pd
import matplotlib.pyplot as plt
s = pd.read_csv("GMV.csv")
Fig = plt.figure(figsize=(8,4))  #创建一个figure
ax1=Fig.add_subplot(221) #画第一个图
ax1.plot_date(s.op_time,s.gmv,'c-')
ax1.set_label("GMV")
ax2=ax1.twinx() #共享x轴,创建次Y坐标轴
ax2.plot_date(s.op_time,s.USERS,'g-') #专门绘制时间函数的
ax2.set_label("Users") #Y轴label
ax2.set_title("Apr-MayGMV/USERs' Trend")#Y轴Title
ax2.legend(loc=0) 
ax3=Fig.add_subplot(222)#画第二个图
ax3.plot(s.USERS,"r--")
ax4=Fig.add_subplot(223)#画第三个图
ax4.plot(s.gmv,"g^")
ax5=Fig.add_subplot(224)#画第四个图
ax5.plot(s.gmv,"bs")
Fig.show()
Fig.savefig("test.pdf")

至于关于对象编程的详细资料,matplot面向对象的编程

下面是常用图的类型,以及用matplot快速作图

1.折线图&散点图

1.1基本公式

(1)折线图

plt.plot(x,y,"g-")

(2)散点图

plt.plt(x,y,"ro")

1.2 美化折线图

首先下图剖析了一张数据图都有哪些组成部分。


Python作图_第1张图片
1.2.1线条颜色
character color
b blue
‘g’ green
‘r’ red
‘c’ cyan
‘m’ magenta
‘y’ yellow
‘k’ black
‘w’ white
1.2.2 线条样式&marker样式

'-'表示实线,'--'表示虚线

character description
'-' solid line style
'--' dashed line style
'-.' dash-dot line style
':' dotted line style
'.' point marker
',' pixel marker
'o' circle marker
'v' triangle_down marker
'^' triangle_up marker
'<' triangle_left marker
'>' triangle_right marker
'1' tri_down marker
'2' tri_up marker
'3' tri_left marker
'4' tri_right marker
's' square marker
'p' pentagon marker
'*' star marker
'h' hexagon1 marker
'H' hexagon2 marker
'+' plus marker
'x' x marker
'D' diamond marker
'd' thin_diamond marker
'' vline marker
'_' hline marker

具体可以参考

1.2.3 轴标题和轴标题的限度
Function Description
plt.xlabel("date") X轴标题
plt.ylabel("GMV") Y轴标题
plt.title("Trends of GMV") 图形标题
plt.xlim(0,7) X轴的限度
plt.ylim(0,30) Y轴的限度
1.2.4 同一坐标系多个图形
(1)将数据列和表现形式直接指定列出
plt.plot(s.USERS,"r--",s.gmv,"b+")
plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^')
(2)一条一条的列出
plt.plot(s.USERS,"r--")
plt.plot(s.gmv,"b+")
1.2.5 主次两套坐标系多个图形
plt.plot_date(s.op_time,s.gmv,'c-')
plt.ylabel("GMV")
plt.twinx()  创立一个独立的Y轴,共享坐标轴
plt.plot_date(s.op_time,s.USERS,'g-')
plt.ylabel("Users")
1.2.6 设置legend
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.lines as mlines

red_line = mlines.Line2D([], [], color='red', label='GMV')
green_line=mlines.Line2D([],[],color='green', label='users') #设置legend的表现形式


s = pd.read_csv("GMV.csv")
Fig = plt.figure(figsize=(8,4))  #创建一个figure
ax1=Fig.add_subplot(221) #画第一个图
plot1=ax1.plot_date(s.op_time,s.gmv,'r-',label="Gmv")
ax1.set_label("GMV")
ax2=ax1.twinx() #共享x轴,创建次Y坐标轴
plot2=ax2.plot_date(s.op_time,s.USERS,'g-',label="Users")
ax2.set_label("Users")
ax2.set_title("Apr-MayGMV/USERs' Trend")
plt.legend(handles=[red_line,green_line])

一些其他的legend函数可以参照

legend 的位置函数
Location String Location Code
‘best’ 0
‘upper right’ 1
‘upper left’ 2
‘lower left’ 3
‘lower right’ 4
‘right’ 5
‘center left’ 6
‘center right’ 7
‘lower center’ 8
‘upper center’ 9
‘center’ 10

2.直方图

ax4=Fig.add_subplot(223)#画第三个图
ax4.hist(s.gmv)
ax4.set_xlabel("GMV")

3.柱状图

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pylab
#coding=utf-8
promote = pd.read_csv("trends.csv")
promote.index = promote['date']
promote.__delitem__('date')
promote['GMV']=promote['GMV']/100000000
#单位为亿
S1=promote[promote.month==11]
#取去年双11的数据
S2=promote[promote.month==6]
#取618的数据
n = len(promote.index)
n1=len(S1.index)
n2=len(S2.index)
X = np.arange(n)+1
X1 = np.arange(n1)+1
Y1 = S1.GMV
X2 = np.arange(n2)+1
Y2 = S2.GMV
#X是1,2,3,4,5,6,7,8,柱的个数
Fig = plt.figure(figsize=(18,12))  #创建一个figure
ax1=Fig.add_subplot(111) #画第一个图
plt.bar(X1, S1.GMV, width=0.35,facecolor = 'lightskyblue',edgecolor = 'white')
plt.bar(X2+n1, S2.GMV, width=0.35,facecolor = 'yellowgreen',edgecolor = 'white')
#X2进行位移蓝色的位置n1
#width:柱的宽度
plt.xticks(X1,fontsize=1)
ax1.set_xticks(X,minor=True) ##设置x轴间隔
ax1.set_xticklabels(promote.index,minor=True)
for x,y in zip(X1,Y1):
    plt.text(x+0.1, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
for x,y in zip(X2,Y2):
    plt.text(x+0.1+n1, y+0.05, '%.2f' % y, ha='center', va= 'bottom')
#给图加text
plt.title('Trends of GMV')
#将图片存储输出
plt.savefig("Gmv_trends.png")
pylab.show('Gmv_trends.png')

4.多个Index情况

#画四张图,每张图都有两个Index,同时呢需要算出每个index的max,sum,mean,and count
import pandas as pd
import numpy as np
import pylab
#coding=utf-8
promote = pd.read_csv("promote.csv")
print(promote)
promote.columns = ['date','GMV','month','year','quarter']
promax = pd.pivot_table(promote,values='GMV',index=['year','quarter'],aggfunc=max)

prosum = pd.pivot_table(promote,values='GMV',index=['year','quarter'],aggfunc=sum)

proavg = pd.pivot_table(promote,values='GMV',index=['year','quarter'],aggfunc=np.mean)

prolen = pd.pivot_table(promote,values='GMV',index=['year','quarter'],aggfunc=len)

#画四个图,最大值,总和,平均值,天数,解决的问题是多个INDEX如何作图

import matplotlib.pyplot as plt
Fig = plt.figure(figsize=(18,10))  #创建一个figure
ax1=Fig.add_subplot(221) #画第一个图
ax1=plt.gca()
###为了将面向对象的绘图库包装成只使用函数的调用接口,pyplot模块的内部保存了当前图表以及当前子图等信息。当前的图表和子图可以使用plt.gcf()和plt.gca()获得,
###分别表示"Get Current Figure"和"Get Current Axes"。在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,比如说:
###plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
promax.plot(kind="bar",ax=ax1)
plt.grid(True,'both')
####添加图表网格线,设置网格线颜色,线形,宽度和透明度
minor_XT=ax1.get_xaxis().get_majorticklocs()
#Get the major tick locations in data coordinates as a numpy array
promax['XT_V']=minor_XT
#[0,1,2,3,4,5,6,7,8,9,10]
print(promax)
major_XT=promax.groupby(by=promax.index.get_level_values(0)).first()['XT_V'].tolist()
print(major_XT)
#get_level_values()Return an Index of values for requested level, equal to the length
#[0,3,6,9]
promax.__delitem__('XT_V')
###__delitem__(self,key):删除给定键对应的元素。
print(promax)
ax1.set_xticks(minor_XT,minor=True) ##设置x轴间隔
ax1.set_xticklabels(promax.index.get_level_values(1),minor=True)
#设置坐标轴的值
ax1.tick_params(which='major',pad=15) ##Set appearance parameters for ticks and ticklabels.
_=plt.xticks(major_XT,(promax.index.get_level_values(0)).unique(),rotation=0)
plt.title('Max of GMV')
plt.xlabel("year.quarter",fontsize=1)



ax2=Fig.add_subplot(222) #画第二个图
ax2=plt.gca()
prosum.plot(kind="bar",ax=ax2)
plt.grid(True,'both')
minor_XT=ax2.get_xaxis().get_majorticklocs()
prosum['XT_V']=minor_XT
major_XT=prosum.groupby(by=prosum.index.get_level_values(0)).first()['XT_V'].tolist()
prosum.__delitem__('XT_V')
ax2.set_xticks(minor_XT,minor=True)
ax2.set_xticklabels(prosum.index.get_level_values(1),minor=True)
ax2.tick_params(which='major',pad=15)
_=plt.xticks(major_XT,(promax.index.get_level_values(0)).unique(),rotation=0)
plt.title('Sum of GMV')
plt.xlabel("year.quarter",fontsize=1)

ax3=Fig.add_subplot(223) #画第三个图
ax3=plt.gca()
proavg.plot(kind="bar",ax=ax3)
plt.grid(True,'both')
minor_XT=ax3.get_xaxis().get_majorticklocs()
proavg['XT_V']=minor_XT
major_XT=proavg.groupby(by=proavg.index.get_level_values(0)).first()['XT_V'].tolist()
proavg.__delitem__('XT_V')
ax3.set_xticks(minor_XT,minor=True)
ax3.set_xticklabels(proavg.index.get_level_values(1),minor=True)
ax3.tick_params(which='major',pad=15)
_=plt.xticks(major_XT,(proavg.index.get_level_values(0)).unique(),rotation=0)
plt.title('Average of GMV')
#plt.show()


ax4=Fig.add_subplot(224) #画第四个图
ax4=plt.gca()
prolen.plot(kind="bar",ax=ax4)
plt.grid(True,'both')
minor_XT=ax4.get_xaxis().get_majorticklocs()
prolen['XT_V']=minor_XT
major_XT=prolen.groupby(by=prolen.index.get_level_values(0)).first()['XT_V'].tolist()
prolen.__delitem__('XT_V')
ax4.set_xticks(minor_XT,minor=True)
ax4.set_xticklabels(prolen.index.get_level_values(1),minor=True)
ax4.tick_params(which='major',pad=15)
_=plt.xticks(major_XT,(prolen.index.get_level_values(0)).unique(),rotation=0)
plt.title('Days of GMV')

plt.savefig("Gmv_promotion.png")
pylab.show('Gmv_promotion.png')

5.饼图

import pandas as pd
pd.options.mode.chained_assignment = None  # default='warn'
import matplotlib.pyplot as plt
# -*- coding: utf-8 -*-
#!/usr/bin/python
import numpy as np
import pylab


promote = pd.read_csv("trends.csv")
promote.index = promote['date']
X1=promote[promote.month==6]
X2=promote[promote.month==11]
S1=X1[X1['date'].isin(['6/17','6/18','6/19','6/20'])]
S2=X2[X2['date'].isin(['11/10','11/11','11/12','11/13'])]
S3=X1[~X1['date'].isin(['6/17','6/18','6/19','6/20'])] #取反
S4=X2[~X2['date'].isin(['11/10','11/11','11/12','11/13'])]#取反

#取高潮时期的数据
S1.__delitem__('date')
S1['GMV'] = S1['GMV']/100000000

S2.__delitem__('date')
S2['GMV'] = S2['GMV']/100000000

S3['GMV'] = S3['GMV']/100000000
S3.__delitem__('date')


S4['GMV'] = S4['GMV']/100000000
S4.__delitem__('date')

X1.__delitem__('date')
X1['GMV'] = X1['GMV']/100000000

X2.__delitem__('date')
X2['GMV'] = X2['GMV']/100000000

#单位为亿
#promote.__setitem__('GMV', 'date','nGMV')
#promote.__delitem__('nGMV')




#取大促时间的数据

n1=S1['GMV']
n2=X1['GMV']
n3=S3['GMV']
n4=S4['GMV']
w1=n1.sum()/n2.sum()*100
r1=n1.mean()
r2=n3.mean()


print(w1)

m1=S2['GMV']
m2=X2['GMV']
w2=m1.sum()/m2.sum()*100
r3=m1.mean()
r4=n4.mean()

#双11占比
size1=[w1,100-w1]
#618占比
size2=[w2,100-w2]

Fig=plt.figure(figsize=(18,12))
ax1=Fig.add_subplot(221) #画第一个图
ax1.labels = [u'618session',u'normal_session']
ax1.colors = ['yellowgreen','lightskyblue']
explode = (0.05,0)

patches,l_text,p_text = plt.pie(size1,explode=explode,labels=ax1.labels,colors=ax1.colors,
                                labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,
                                startangle = 90,pctdistance = 0.6)
#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
#shadow,饼是否有阴影
#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#pctdistance,百分比的text离圆心的距离
#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
#改变文本的大小
#方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
    t.set_size=(30)
for t in p_text:
    t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
ax1.axis('equal')
plt.title("618 session")
ax1.legend()


ax2=Fig.add_subplot(222) #画第二个图
ax2.labels = [u'Double11session',u'normal_session']
ax2.colors = ['yellowgreen','lightskyblue']
explode = (0.05,0)

patches,l_text,p_text = plt.pie(size2,explode=explode,labels=ax2.labels,colors=ax2.colors,
                                labeldistance = 1.1,autopct = '%3.1f%%',shadow = False,
                                startangle = 90,pctdistance = 0.6)
#labeldistance,文本的位置离远点有多远,1.1指1.1倍半径的位置
#autopct,圆里面的文本格式,%3.1f%%表示小数有三位,整数有一位的浮点数
#shadow,饼是否有阴影
#startangle,起始角度,0,表示从0开始逆时针转,为第一块。一般选择从90度开始比较好看
#pctdistance,百分比的text离圆心的距离
#patches, l_texts, p_texts,为了得到饼图的返回值,p_texts饼图内部文本的,l_texts饼图外label的文本
#改变文本的大小
#方法是把每一个text遍历。调用set_size方法设置它的属性
for t in l_text:
    t.set_size=(30)
for t in p_text:
    t.set_size=(20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
ax2.axis('equal')
plt.title("Double 11 session")
ax2.legend()

ax3=Fig.add_subplot(223,frameon=False) #画第三个图
ax3.labels = [u'618session',u'normal_session']
ax3.colors = ['yellowgreen','lightskyblue']

X1=[1,2]
Y1=[r1,r2]
plt.bar(X1, Y1, width=0.35,facecolor = 'lightskyblue',edgecolor = 'white')
#选择是否显示刻度值:x轴上,1为下,2为上;y轴上,1为左,2为右;
for tick in ax3.xaxis.get_major_ticks():
    tick.label1On = False
    tick.label2On = False
for tick in ax3.yaxis.get_major_ticks():
    tick.label1On = False
    tick.label2On = False
#选择如何显示刻度
ax3.xaxis.set_ticks_position('none')
ax3.yaxis.set_ticks_position('none')
ax3.set_xticks(X1,minor=True) ##设置x轴间隔
ax3.set_xticklabels(ax3.labels,minor=True)
for x,y in zip(X1,Y1):
    plt.text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')



ax4=Fig.add_subplot(224,frameon=False) #画第四个图,不显示坐标轴,但是刻度仍在
ax4.labels = [u'Double 11 session',u'normal_session']
ax4.colors = ['yellowgreen','lightskyblue']

X2=[1,2]
Y2=[r3,r4]
plt.bar(X2, Y2, width=0.35,facecolor = 'lightskyblue',edgecolor = 'white')
#选择是否显示刻度值:x轴上,1为下,2为上;y轴上,1为左,2为右;
for tick in ax4.xaxis.get_major_ticks():
    tick.label1On = False
    tick.label2On = False
for tick in ax4.yaxis.get_major_ticks():
    tick.label1On = False
    tick.label2On = False
#选择如何显示刻度
ax4.xaxis.set_ticks_position('none')
ax4.yaxis.set_ticks_position('none')
ax4.set_xticks(X2,minor=True) ##设置x轴间隔
ax4.set_xticklabels(ax4.labels,minor=True)

for x,y in zip(X2,Y2):
    plt.text(x, y+0.05, '%.2f' % y, ha='center', va= 'bottom')

plt.savefig("Gmv_ratio.png")
pylab.show('Gmv_ratio.png')

#https://yantianmin.wordpress.com/2010/08/25/matplotlib%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%92%8C%E6%8A%80%E5%B7%A7/

你可能感兴趣的:(Python作图)