本文章基于《Python编程,从入门到实践》,Eric Matthes著。书中采用的是matplotlib库和pygal库。我的配置为anaconda下python3.7.1,由于目前pygal官方未提供python3.7版本,故创建了python3.5环境。
文章会将画图从零讲起,如果您有一定的基础,或想绘制非常炫酷的图像,请访问matplotlib官网或pygal官网查看更多。也可以查看我的另一篇文档python画图——进阶篇(预计2019/5/8发布)
matplotlib.pyplot是一个命令型函数集合,包含了众多的函数,这些函数可以控制画布,让使用者如使用matlab一样方便地进行绘图。
在使用前,需要导入该库,一般简写为plt。
import matplotlib.pyplot as plt
// draw a line
plt.plot(array_x,array_y,options)
可选项options包括:
// draw a scatter
plt.scatter(array_x,array_y,options)
// draw a series of points with options
array_x=['1','2','3','4','5']
array_y=['1','4','9','16','25']
plt.scatter(array_x,array_y,s=15,edgecolor='pink',c=y,cmap=plt.cm.cool)
plt.show()
可选项options包括:
// fill the region that between two lines
plt.fill_between(array_x,array_y1,array_y2,options)
可选项options包括:
plt.axis([x0,xt,y0,yt])
x0表示x标轴起始x坐标;xt表示x轴最后一个x坐标
y0表示y标轴起始y坐标;yt表示y轴最后一个y坐标
// create a tuple variable as x/y scale
plt.xlim((a,b))
plt.ylim((a,b))
// create an array variable as x/y scale
plt.xticks(array_x)
plt.yticks(array_y)
// create a mapping between an numeric array and a literal array
plt.xticks(array_x,words_x)
上述命令分别生成x/y轴的刻度,内容分别为元组/数组/文字
plt.tick_params(options)
可选项options包括:
plt.xlabel("",options)
plt.ylabel("",options)
fig.autofmt_xdate() // plt.gcf().autofmt_xdate()
// transform date
import datetime from datetime // you need import this first
date=datetime.strptime(d,"%Y-%m-%d")
可选项options包括:
plt.axes().get_xaxis().set_visible(False)
plt.axes().get_yaxis().set_visible(False)
注意此命令需要用在plt.show()之前,不然会报错,因为plt.show()创建了一个画布
如果想先看到结果,可以首先实例化一个fig,调用fig的show()函数
plt.title("",options)
可选项options包括:
fig=plt.figure(dpi=xxx,figsize=(width,height))
dpi是规定像素质量,即每英寸多少个像素,一般不写即为默认值
figsize是生成的图片大小,单位是英寸
plt.savefig('figname.xxx',options)
可选项options包括:
示例内容为使用matplotlib.pyplot完成的随机漫步
from random import choice
import matplotlib.pyplot as plt
class RandomWalk():
"""创建随即漫步类"""
def __init__(self,num_points=5000):
self.num_points=num_points
self.x_values=[0] //用于放置x数组
self.y_values=[0] //用于放置y数组
def fill_walk(self):
while len(self.x_values)<self.num_points:
x_direction=choice([1,-1])
x_distance=choice([0,1,2,3,4])
x_step=x_direction*x_distance //创建x的步进
y_direction=choice([1,-1])
y_distance=choice([0,1,2,3,4])
y_step=y_direction*y_distance //创建y的步进
if x_step==0 and y_step==0: //如果原地不动,则跳过,重新生成
continue
next_x=self.x_values[-1]+x_step
next_y=self.y_values[-1]+y_step
self.x_values.append(next_x)
self.y_values.append(next_y) //创建了两个数组,存储xy的步进值
while True:
rw=RandomWalk(50000) //创建一个生成5w个点的实例
rw.fill_walk() //进行随即漫步
plt.figure(figsize=(10,6)) //设置画布大小
point_numbers=list(range(rw.num_points))
plt.scatter(rw.x_values,rw.y_values,s=1,c=point_numbers,cmap=plt.cm.cool) //绘制各点,并且使用映射效果cool
plt.scatter(0,0,c='green',edgecolors='none',s=50) //将初始点突出显示
plt.scatter(rw.x_values[-1],rw.y_values[-1],c='red',edgecolors='none',s=50) //将末尾点突出显示
plt.axes().get_xaxis().set_visible(False) //隐藏x轴
plt.axes().get_yaxis().set_visible(False) //隐藏y轴
plt.show()
keep_running=input("Make another walk?(Y/N)")
if keep_running=='N':
break
pygal可以生成可缩放的矢量图,一般保存文件格式为svg
使用pygal前,需要导入pygal包。了解更多关于pygal,可以访问pygal官网
import pygal
hist=pygal.Bar(options)
hist.title=""
hist.x_labels=['1','2','3','4','5']
hist.x_title=""
hist.y_title=""
hist.add('name',array_y)
hist.render_to_file('xxx.svg')
hist.title=:完成了直方图标题的规定
hist.x_labels=[]:x轴显示的内容
hist.x_title/hist.y_title:规定x/y轴的标题
hist.add(‘name’,array_y):将数组array_y即值加入图片,图例为name
hist.render_to_file(‘name.svg’):保存为svg文件,使用浏览器打开
pygal.Bar()可选项为:
可以使用pygal.Config()创建一个实例,来更改坐标轴的其他参数
import pygal
from pygal.style import LightColorizedStyle as LCS, LightenStyle as LS
my_style=LS('#333366',base_style=LCS)
my_config=pygal.Config() // create a new style
my_config.x_label_rotation=45 // rotate 45 degrees clockwise for x labels
my_config.show_legend=False // hide the legend
my_config.title_font_size=24 // set fontsize of title
my_config.label_font_size=14 // set fontsize of labels
my_config.major_label_font_size=18 // set fontsize of major labels
my_config.truncate_label=15 // limit the repository's name below 15 words, you can check it in svg file when your mouse moves on it
my_config.show_y_guides=False // hide the y grid
my_config.width=1000 // the width of figure
chart=pygal.Bar(my_config,style=my_style)
在交互方面,如果不设置其他参数,将鼠标放置在直方图上时,会显示数值,若要添加描述,可以向bar.add()函数提供一个字典列表,此外,还可以加入链接,即当点击该直方图时,可以转到对应的网页
dicts=[{'value':1,'label':one},{'value':2,'label':two},{'value':3,'label':three}]
//dicts=[{'value':1,'label':one,'xlink':url_1},{'value':2,'label':two,'xlink':url_2},{'value':3,'label':three,'xlink':url_3}]
chart.add('',dicts)
line=pygal.Line(options)
line.title=""
line.x_labels=array
line.x_labels_major=array[::N] // label with an inteval N
line.add('name',array_y)
其中,pygal.LIne()的可选项包括:
with open('Dashboard.html','w',encoding='utf8') as html_file:
html_file.write('Dashboard \n')
for svg in svg_list:
html_file.write(' \n'.format(svg))
html_file.write('')
这样就可以在生成的html网页中查看自己的svg图
以上内容参考《Python编程 从入门到实践》
后续一篇文章将基于matplotlib和pygal官网,探索一些有趣的图像的画法!