【python】matplotlib画图

应项目要求,分析关于控烟的2016年11月的新闻数据,今天用python画了一个折线图和饼图,分别表现11月每天的新闻数据量和11月份新闻的主要来源。现把相关知识整理如下: **相关参考资料:** matplotlib官方文档:http://matplotlib.org/api/pyplot_summary.html (api的调用及一些示例代码) 一个中文版的文档(不全):http://old.sebug.net/paper/books/scipydoc/matplotlib_intro.html matplotlib较详细的剖析:http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html 三种图的绘制:http://www.cnblogs.com/hustlx/p/5264562.html 多张图的绘制:http://www.2cto.com/kf/201407/317115.html 今天应项目要求画了一个折线图一个饼状图,顺势整理一下python的matplotlib库的画图技巧。 **一、环境准备** 首先是需要下载安装相关的工具包,之前装了Numpy和Scipy,这次只装了Matplotlib。分别输入下面的代码进行安装:
    pip install numpy  
    pip install scipy  
    sudo apt-get install python-matplotlib  
测试是否安装成功
python  
>>> import pylab  
**二、开始画图** 跟matlab非常类似 1.简单直线图 代码及注释如下:
    import numpy as np  
    import matplotlib.pyplot as plt  

    x=[0,1]  #设置x轴
    y=[0,1]  #设置y轴

    plt.figure()  #创建绘图对象

    #创建绘图对象,figsize参数可以指定绘图对象的宽度和高度,单位为英寸,一英寸=80px  
    #plt.figure(figsize=(8,4))  

    plt.plot(x,y)  #在当前绘图对象进行绘图,两个参数是x、y轴的数据

    #在当前绘图对象中画图(x轴,y轴,给所绘制的曲线的名字,画线颜色,画线宽度)  
    #plt.plot(x,y,label="$sin(x)$",color="red",linewidth=2)

    plt.xlabel("time(s)")  #设置x轴标签
    plt.ylabel("value(m)")  #设置y轴标签
    plt.title("A simple plot")  #设置标题

    #图表的标题  
plt.title("PyPlot First Example")  

    #Y轴的范围  
    plt.ylim(-1.2,1.2)  

    #显示图示  
    plt.legend()  

    #显示图  
    plt.show()  plt.savefig("easyplot.jpg")  #保存图像
**2.画折线图**
plt.plot(x,y,"b--",linewidth=1)   #在当前绘图对象绘图(X轴,Y轴,蓝色虚线,线宽度)
简单实现了一个给定数值的折线图的绘制,暂未实现python读取Excel数值的部分,因此代码比较繁琐。 我的代码如下:
#-*- coding: utf-8 -*-
import xlrd
from matplotlib import pyplot as plt
from matplotlib.ticker import  MultipleLocator

import numpy as np
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

plt.rcParams['font.sans-serif'] = ['SimHei']

data0 = xlrd.open_workbook('F:/11data.xlsx')
table0 = data0.sheets()[0]

source = []
source.extend(table0.col_values(0)) # 每日日期 x值
set1 = set(source) # 来源(无重复)
dict1 = {} # 存储来源及来源对应的数目

# 得到dict1
def getDict():
    for item in set1:
        dict1.update({item: source.count(item)})

    return dict1

group_labels = ['1日','2日','3日','4日','5日','6日','7日','8日','9日','10日','11日','12日','13日','14日','15日','16日','17日','18日','19日','20日','21日','22日','23日','24日','25日','26日','27日','28日','29日','30日']
#x=[u"1日",u"2日",u"3日",u"4日",u"5日",u"6日",u"7日",u"8日",u"9日",u"10日",u"11日",u"12日",u"13日",u"14日",u"15日",u"16日",u"17日",u"18日",u"19日",u"20日",u"21日",u"22日",u"23日",u"24日",u"25日",u"26日",u"27日",u"28日",u"29日",u"30日"]
getDict()
x=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30]
y=[26,23,24,24,6,11,34,32,33,28,56,28,16,36,51,44,35,40,2,32,56,63,70,76,60,11,11,58,65,55]
labels = dict1.keys()
sizes = dict1.values()     #y
plt.figure()
plt.plot(x,y,'-r')
plt.plot(x,y,'ro')
yminorLocator = MultipleLocator(5)
plt.xlabel("日期")
plt.ylabel("新闻数(条)")
plt.title("2016年11月新闻数")
ymajorLocator   = MultipleLocator(10) #将y轴主刻度标签设置为0.5的倍数
plt.xticks(x, group_labels, rotation=45)
# plt.xlim(0, max(x))
#    plt.savefig(s)
plt.show()


plt.legend()
plt.show()
**3.画饼状图** 画饼图用到的方法为: matplotlib.pyplot.pie() 参数为:
pie(x, explode=None, labels=None,  
    colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'),  
    autopct=None, pctdistance=0.6, shadow=False,  
    labeldistance=1.1, startangle=None, radius=None,  
    counterclock=True, wedgeprops=None, textprops=None,  
    center = (0, 0), frame = False ) 
参数说明:
x          (每一块)的比例,如果sum(x) > 1会使用sum(x)归一化
labels (每一块)饼图外侧显示的说明文字 explode (每一块)离开中心距离 startangle 起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起 shadow 是否阴影 labeldistance label绘制位置,相对于半径的比例, 如
labels  (每一块)饼图外侧显示的说明文字
explode (每一块)离开中心距离
startangle  起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起
shadow  是否阴影
labeldistance label绘制位置,相对于半径的比例, 如<1则绘制在饼图内侧
autopct 控制饼图内百分比设置,可以使用format字符串或者format function
        '%1.1f'指小数点前后位数(没有用空格补齐)
pctdistance 类似于labeldistance,指定autopct的位置刻度
radius  控制饼图半径

返回值:
如果没有设置autopct,返回(patches, texts)
如果设置autopct,返回(patches, texts, autotexts)
patches -- list --matplotlib.patches.Wedge对象
texts autotexts -- matplotlib.text.Text对象
我的代码:
# coding=utf-8
__author__ = 'leilu'

#2016年11月关于控烟的新闻的爬虫结果,新闻的主要媒体来源以饼图形式表现

import xlrd
from matplotlib import pyplot as plt
from fuzzywuzzy import fuzz
import numpy as np
import sys
reload(sys)     #因为在sys加载后,setdefaultencoding方法被删除了,所以要通过重新导入sys来设置系统编码
sys.setdefaultencoding('utf-8')    #将系统默认编码改为utf-8

plt.rcParams['font.sans-serif'] = ['SimHei']   #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False    #用来正常显示负号
#有中文出现的情况,需要u'内容'

data0 = xlrd.open_workbook('F:/11.xlsx')     #读Excel工作簿
table0 = data0.sheets()[0]       #读工作表

source = []
source.extend(table0.col_values(2)) # 所有新闻的来源
set1 = set(source) # 来源(无重复)
dict1 = {} # 存储来源及来源对应的数目

# 得到dict1
def getDict():
    for item in set1:
        dict1.update({item: source.count(item)})

    f = open("result.txt", 'wb')    #生成输出文档

    #把头两个字相同的新闻来源归为一种
    for i in dict1.keys():
        a = dict1.keys()
        if i in a:
            a.remove(i)
        else:
            continue
        # print dict1[i]
        for j in a:
            # print dict1[j]
            if i.upper()[:2] == j.upper()[:2]:
                if len(i) > len(j) and i in dict1.keys() and j in dict1.keys():
                    f.write(i + '->' + j + '  ')
                    print str(dict1[i]) + '->' + str(dict1[j])
                    dict1[j] += dict1[i]
                    dict1.pop(i)
                elif i in dict1.keys() and j in dict1.keys():
                    f.write(j + '->' + i + '  ')
                    print str(dict1[i]) + '<-' + str(dict1[j])
                    dict1[i] += dict1[j]
                    dict1.pop(j)

    f.close()

    dict1['其他'] = 0

    for i in dict1.keys():
        if dict1[i] < 5:                 #条目数小于5,则该来源归为其他
            dict1['其他'] += dict1[i]
            dict1.pop(i)

    return dict1

getDict()

# 画饼图
labels = dict1.keys()
sizes = dict1.values()

patches, l_text, p_text = plt.pie(sizes, labels=labels,
                                  labeldistance=1.2, autopct='%3.1f%%',
                                  shadow=False,
                                  startangle=90, pctdistance=1.08)

for t in l_text:
    t.set_size = (30)
for t in p_text:
    t.set_size = (20)
# 设置x,y轴刻度一致,这样饼图才能是圆的
plt.axis('equal')
plt.legend()
plt.show()
**4.设置线条形状、颜色等**
本文是学习《matplotlib for python developers》的一点笔记
plot画图时可以设定线条参数。包括:颜色、线型、标记风格。
1)控制颜色
颜色之间的对应关系为
b—blue   c—cyan  g—green    k—-black
m—magenta r—red  w—white    y—-yellow
有三种表示颜色的方式:
a:用全名  b:16进制如:#FF00FF  c:RGB或RGBA元组(1,0,1,1) d:灰度强度如:‘0.7’
2)控制线型
符号和线型之间的对应关系
-      实线
–     短线
-.     短点相间线
:     虚点线

3)控制标记风格
标记风格有多种:
.  Point marker
,  Pixel marker
o  Circle marker
v  Triangle down marker
^  Triangle up marker
<  Triangle left marker
>  Triangle right marker
1  Tripod down marker
2  Tripod up marker
3  Tripod left marker
4  Tripod right marker
s  Square marker
p  Pentagon marker
*  Star marker
h  Hexagon marker
H  Rotated hexagon D Diamond marker
d  Thin diamond marker
| Vertical line (vlinesymbol) marker
_  Horizontal line (hline symbol) marker
+  Plus marker
x  Cross (x) marker
下面的实例集合以上三种:具体代码和效果如下所示:
[python] view plain copy
print ?
  1. import matplotlib.pyplot as plt   
  2. import numpy as np   
  3. y = np.arange(130.3)   
  4. plt.plot(y, ’cx–’, y+1‘mo:’, y+2‘kp-.’);  
  5. plt.show()  
import matplotlib.pyplot as plt 
import numpy as np 
y = np.arange(1, 3, 0.3) 
plt.plot(y, 'cx--', y+1, 'mo:', y+2, 'kp-.');
plt.show()



链接:http://matplotlib.org/api/pyplot_api.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值