matplotlib 随记
1、安装
window平台下推荐安装Enthought canopy,包含matplotlib和它所依赖的包;
linux下一般默认内置了matplotlib,直接使用就可以了。
2、在没有图形界面的Linux系统中,引用pyplot等会调用display的模块时,在之前加这么两句(切记):
import matplotlib
matplotlib.use('Agg')
matplotlib.use('Agg')
3、示例:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
from matplotlib.ticker import MultipleLocator
from matplotlib.dates import DateFormatter
from matplotlib.ticker import MultipleLocator
from matplotlib.dates import DateFormatter
fig = plt.figure(111, figsize=(13,6)) # figure 定义一张图片, figsize决定图片的大小
ax = fig.add_subplot() # 在图片上定义一块绘图区域,可以通过 fig.gca() 获得
ax = fig.add_axes([0.08, 0.15, 0.82, 0.8]) # [left, bottom, width, height]
x = arange(0, 30, 1)
x1 = .....
ax.plot(x, y1, label=u'群聊', color='red', linewidth=2) # 绘制线,并设置属性
y1 = .....
ax.plot(x, y1, label=u'私聊', color='blue', linewidth=2) # 绘制另一条线
ax.legend(loc='center left', bbox_to_anchor=(1,0.5)) # 设置图例的位置
xaxis = ax.xaxis # 获取绘图区域的x轴
yaxis = ax.yaxis # 获取绘图区域的y轴
xaxis.set_major_locator(MultipleLocator(1)) # x轴的坐标间隔设置为1
xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) # 格式化日期
fig.autofmt_xdate() # 自动格式化日期,防止其溢出绘图区域
for label in xaxis.get_ticklabels(): # 设置x轴上显示文本的样式
label.set_rotation(60)
label.set_fontsize(13)
fig.subplots_adjust(hspace=0.3) # 透明度
plt.grid() # 显示网格
ax = fig.add_subplot() # 在图片上定义一块绘图区域,可以通过 fig.gca() 获得
ax = fig.add_axes([0.08, 0.15, 0.82, 0.8]) # [left, bottom, width, height]
x = arange(0, 30, 1)
x1 = .....
ax.plot(x, y1, label=u'群聊', color='red', linewidth=2) # 绘制线,并设置属性
y1 = .....
ax.plot(x, y1, label=u'私聊', color='blue', linewidth=2) # 绘制另一条线
ax.legend(loc='center left', bbox_to_anchor=(1,0.5)) # 设置图例的位置
xaxis = ax.xaxis # 获取绘图区域的x轴
yaxis = ax.yaxis # 获取绘图区域的y轴
xaxis.set_major_locator(MultipleLocator(1)) # x轴的坐标间隔设置为1
xaxis.set_major_formatter(DateFormatter('%Y-%m-%d')) # 格式化日期
fig.autofmt_xdate() # 自动格式化日期,防止其溢出绘图区域
for label in xaxis.get_ticklabels(): # 设置x轴上显示文本的样式
label.set_rotation(60)
label.set_fontsize(13)
fig.subplots_adjust(hspace=0.3) # 透明度
plt.grid() # 显示网格
①~~~~~~~~~到这里就可以显示了,plt.show()就可以了,下面是在Django中的用法~~~~~~
canvas = FigureCanvas(fig)
response = django.http.HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
response = django.http.HttpResponse(content_type='image/png')
canvas.print_png(response)
return response
②~~~~~~~~~把matplotlib生成的图像插入到excel中(先保存到本地,然后转为bmp格式,最后插入到excel中)~~~~~
file_in = 'temp.png'
file_out = 'temp.bmp'
fig.savefig(file_in)
img = Image.open(file_in)
img.load() # 这句不可少,否则会出错
if len(img.split()) == 4:
r, g, b, a = img.split()
img = Image.merge('RGB', (r, g, b))
img.save(file_out)
# 插入bmp图像
ws.insert_bitmap(file_out, 0, 4)
# 用完之后记得删除
if os.path.exists(file_in) and os.path.exists(file_out):
os.remove(file_in)
os.remove(file_out)
file_out = 'temp.bmp'
fig.savefig(file_in)
img = Image.open(file_in)
img.load() # 这句不可少,否则会出错
if len(img.split()) == 4:
r, g, b, a = img.split()
img = Image.merge('RGB', (r, g, b))
img.save(file_out)
# 插入bmp图像
ws.insert_bitmap(file_out, 0, 4)
# 用完之后记得删除
if os.path.exists(file_in) and os.path.exists(file_out):
os.remove(file_in)
os.remove(file_out)
4、matplotlib输出图象的中文显示问题
(1)找到c:\python24\lib\site-packages\matplotlib\mpl-data\matplotlibrc (修改font.sans-serif、verbose.level两行代码)
(2)找到了matplotlibrc设置文件,是个文本文件,随便找个编辑器打开它,找到font.sans-serif一行,将后边直接改成一个nothing;(把 “:”后的“#......”都去掉)
(3)找到verbose.level一行,把默认的silent改成debug.
(4)找到Vera.ttf,将Vera.ttf用一个中文TrueType文字替换,名字是Vera,后缀是.ttf(True Type Font),即可。
(5)字符串,都用u"..."的形式.(文件编码utf-8 加上" # coding = utf-8 "一行.)
4、参考文章:
posted on 2014-04-14 22:46 fish_1949 阅读(2036) 评论(0) 编辑 收藏 举报