matplotlib绘图

需求简述:从mongodb取出目标数据,按照日期将成都市房屋成交量以折线图的形式展示;有坐标名称,有图例;日期为x轴,成交量为y轴,如果日期过多,则部分均匀展示;新房和二手房分两个图展示。

1、日期作为x轴

参考官方示例api example code: date_demo.py

#按照月份展示坐标轴坐标x值,按照日期绘图,
months = mdates.MonthLocator()  # every month
days = mdates.DayLocator() #every day
daysFmt = mdates.DateFormatter('%Y%m%d')

# format the ticks
ax.xaxis.set_major_locator(days) #坐标x轴实际的点
ax.xaxis.set_major_formatter(daysFmt)
ax.xaxis.set_minor_locator(days) #坐标x轴精简后的点

#x轴字符串旋转
for label in ax.get_xticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment('right')

#set min and max x,防止x轴过长,数据展示抱团
timemin = x_gaoxin_new[0]
timemax = x_gaoxin_new[len(x_gaoxin_new)-1]
ax.set_xlim(timemin, timemax)

2、设置坐标轴名称

#set title of axis
ax.set_ylabel(u'成交量(套)')  
ax.set_xlabel(u'交易日')  
这里遇到一个中文乱码问题,解决方案: matplotlib画图中文乱码的解决办法

a.修改matplotlibrc文件。进入Python安装目录下的Lib\site-packages\matplotlib\mpl-data目录,打开matplotlibrc文件,删除font.family和font.sans-serif两行前的#,并在font.sans-serif后添加微软雅黑字体(Microsoft YaHei)

b.代码中使用unicode编码。ax.set_xlabel(u'交易日')

3、设置图例

最开始直接使用legend,不生效,报错: UserWarning: Legend does not support [<matplotlib.lines.Line2D object at 0x000000001074E7F0>]Use proxy artist instead.
line1 = ax1.plot(x_gaoxin_new, y_gaoxin_new,'rs-')
line2 = ax1.plot(x_all_new,y_all_new,'go-')
...
fig.legend((line1, line2), ('gaoxin', 'chengdu'), 'upper left')

参考官方文档legend_demo更改一种写法,能正常显示:

line1 = ax1.plot(x_gaoxin_new, y_gaoxin_new,'rs-',label=u'高新区')
line2 = ax1.plot(x_all_new,y_all_new,'go-',label=u'成都市')
...
legend = pl.legend(loc='center', shadow=True, fontsize='x-large')
# Put a nicer background color on the legend.
legend.get_frame().set_facecolor('#00FFCC')

但是当后面再加一张图后,这个图例显示就会在最后一张图上显示,存在一定瑕疵,后面再解决。

4、设置图名

#设置图标题
ax1.set_title(u'商品房今日成交',{},loc='center')
ax2.set_title(u'二手房今日成交',{},loc='center')

5、一个画布上画多张图

首先创建一个figure对象,向后使用figure.add_axes()方法向figure添加axes即可。

fig = pl.figure()

#按照[left,bottom,width,height]新建一个axes到figure
ax1 = fig.add_axes([0.1, 0.65, 0.85, 0.3])
ax2 = fig.add_axes([0.1, 0.15, 0.85, 0.3])

line1 = ax1.plot(x_gaoxin_new, y_gaoxin_new,'rs-',label=u'高新区')
line2 = ax1.plot(x_all_new,y_all_new,'go-',label=u'成都市')

line3 = ax2.plot(x_gaoxin_old, y_gaoxin_old,'rs-',label=u'高新区')
line4 = ax2.plot(x_all_old,y_all_old,'go-',label=u'成都市')

6、效果图


7、源码

# --*-- coding: utf-8 --*--

__Author__ = "Leng Fuping"
__Doc__ = "chart paln sample";

import numpy as np
import matplotlib.pyplot as pl
from pymongo import MongoClient
import pymongo
import matplotlib.dates as mdates

import time
import datetime

client = MongoClient("localhost", 27017)
db = client.housemarketing
collection  = db.housemarketing

x_gaoxin_new = []
y_gaoxin_new = []
x_all_new = []
y_all_new = []

x_gaoxin_old = []
y_gaoxin_old = []
x_all_old = []
y_all_old = []

for i in  collection.find({ "type" : "商品房今日成交","dist" : "高新区"}).sort("cdate", pymongo.ASCENDING):
	x_gaoxin_new.append(datetime.datetime.strptime(i["cdate"], "%Y%m%d").date())
	y_gaoxin_new.append(int(i["harea"]))

for i in  collection.aggregate([{'$match' :{ "type" : "商品房今日成交"}},{'$group':{'_id':"$cdate", 'harea' : {'$sum':'$harea'}}}, {'$sort' : {'_id':1}}]):
	x_all_new.append(datetime.datetime.strptime(i["_id"], "%Y%m%d").date())
	y_all_new.append(int(i["harea"]))

for i in  collection.find({ "type" : "二手房今日成交","dist" : "高新区"}).sort("cdate", pymongo.ASCENDING):
	x_gaoxin_old.append(datetime.datetime.strptime(i["cdate"], "%Y%m%d").date())
	y_gaoxin_old.append(int(i["harea"]))

for i in  collection.aggregate([{'$match' :{ "type" : "二手房今日成交"}},{'$group':{'_id':"$cdate", 'harea' : {'$sum':'$harea'}}}, {'$sort' : {'_id':1}}]):
	x_all_old.append(datetime.datetime.strptime(i["_id"], "%Y%m%d").date())
	y_all_old.append(int(i["harea"]))	
print(x_gaoxin_new)
fig = pl.figure()

#按照[left,bottom,width,height]新建一个axes到figure
ax1 = fig.add_axes([0.1, 0.65, 0.85, 0.3])
ax2 = fig.add_axes([0.1, 0.15, 0.85, 0.3])

#设置图标题
ax1.set_title(u'商品房今日成交',{},loc='center')
ax2.set_title(u'二手房今日成交',{},loc='center')

#使用数据渲染图
line1 = ax1.plot(x_gaoxin_new, y_gaoxin_new,'rs-',label=u'高新区')
line2 = ax1.plot(x_all_new,y_all_new,'go-',label=u'成都市')

line3 = ax2.plot(x_gaoxin_old, y_gaoxin_old,'rs-',label=u'高新区')
line4 = ax2.plot(x_all_old,y_all_old,'go-',label=u'成都市')

#按照月份展示坐标轴坐标x值,按照日期绘图,
months = mdates.MonthLocator()  # every month
days = mdates.DayLocator() #every day
daysFmt = mdates.DateFormatter('%Y%m%d')

# format the ticks
ax1.xaxis.set_major_locator(days)
ax1.xaxis.set_major_formatter(daysFmt)
ax1.xaxis.set_minor_locator(days)

#x轴字符串旋转
for label in ax1.get_xticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment('right')

ax2.xaxis.set_major_locator(days)
ax2.xaxis.set_major_formatter(daysFmt)
ax2.xaxis.set_minor_locator(days)

#x轴字符串旋转
for label in ax2.get_xticklabels():
    label.set_rotation(30)
    label.set_horizontalalignment('right')

#set min and max x
timemin = x_gaoxin_new[0]
timemax = x_gaoxin_new[len(x_gaoxin_new)-1]
ax1.set_xlim(timemin, timemax)

#set title of axis
ax1.set_ylabel(u'成交量(套)')  
ax1.set_xlabel(u'交易日')  
ax2.set_ylabel(u'成交量(套)')  
ax2.set_xlabel(u'交易日')  

ax1.format_xdata = mdates.DateFormatter('%Y%m%d')
ax1.grid(True)
ax2.format_xdata = mdates.DateFormatter('%Y%m%d')
ax2.grid(True)


#设置和显示图例
legend = pl.legend(loc='center', shadow=True, fontsize='x-large')
# Put a nicer background color on the legend.
legend.get_frame().set_facecolor('#00FFCC')

pl.show()

8、TODO

a、图例只能显示在一个图中;

b、弄清楚matplotlib的关键实体

9、参考资料

matplotlib api

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值