2018.10.23
matplotlib
今天在捣鼓matplotlib,把之前的内存分析数据,捣鼓成图片。目前来看效果还可以。
记录一些matplotlib学习经验
https://www.cnblogs.com/duye/p/8862666.html
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
matplotlib.rcParams["font.family"] = "SimHei" # 支持中文
matplotlib.rcParams["axes.unicode_minus"] = False # 正常显示负号
# 隐藏上右的线
def HideTopAndRight():
ax = plt.gca()
ax.spines['right'].set_color('none')
# 居中
def Center():
ax = plt.gca()
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
# 画图
def DrawGraph(dctDrawData = None):
if not dctDrawData:
raise Exception("No Data!!")
plt.figure()
iLen = len(dctDrawData)
iPos = 0
for sTypeName, dctData in dctDrawData.iteritems():
iPos += 1
pGraph = plt.subplot(iLen, 1, iPos) # iLen * 1 中第iPos个
plt.sca(pGraph) # 选中该图
for sDataLabel, dctShowData in dctData.iteritems():
lstXData = dctShowData.get("XData", [])
lstYData = dctShowData.get("YData", [])
HideTopAndRight()
if len(pGraph.get_xticklabels()) > 15: # label数量大于15竖着显示标签
for tick in pGraph.get_xticklabels():
tick.set_roration(270)
plt.plot(lstXData, lstYData, label = dctShowData.get("Label", "Label"))
plt.legend(loc='upper right') # 标签位置
plt.xlabel("X")
plt.ylabel("Y")
plt.show() # 显示图片
# 同一副图显示多种情况图,有可能线条会折来折去,很不美观,如X轴的类型不一样,但都画在了一起
def ChangeDataSort(XData, YData, lstLabel):
# XData X轴显示数据,YData Y轴显示数据 lstLabel X轴所有标签集合
iFindPos = 0 # 从XData首位开始搜索
for iPos, sLabel in enumerate(lstLabel):
if sLabel in XData:
iXDataPos = XData.index(sLabel)
XData[iFindPos], XData[iXDataPos] = XData[iXDataPos], XData[iFindPos] # 交换X轴位置
YData[iFindPos], YData[iXDataPos] = YData[iXDataPos], YData[iFindPos] # 同时交换对应Y轴位置
iFindPos += 1
return XData, YData
数据格式化输出
def Format(lstRowData, lstHeadData):
BORDER1 = " | "
BORDER2 = "="
lstTempRowData = lstRowData[:]
lstTempRowData.append(lstHeadData)
lstCols = zip(*lstTempRowData) # N 列
lstColWidth = [] # 每列宽度
for col in lstCols:
iWidth = max([len(str(s)) for s in col])
lstColWidth.append(iWidth)
lstElement = []
for iWidth in lstColWidth:
lstElement.append(BORDER2 * iWidth)
sBorder = BORDER1.join(lstElement) # "|=====|"分界线
lstElement = []
for sHead, iWidth in zip(lstHeadData, lstColWidth):
lstElement.append(sHead.rjust(iWidth)) # 按iWidth右对齐,用空格补齐
sContent = BORDER1.join(lstElement) # 标题
yield sContent
yield sBorder
for tRow in lstRowData:
lstElement = []
for sDesc, iWidth in zip(tRow, lstColWidth):
lstElement.append(str(sDesc).rjust(iWidth))
sContent = BORDER1.join(lstElement)
yield sContent
# 将数据格式输出的方法
def OutputFormat(lstRowData, lstHeadData, f = None):
if f is none:
f = sys.stdout
for s in Format(lstRowData, lstHeadData):
f.write(s)
f.write(os.linesep)
f.flush()
#举例
lstRowData = [("小明", "8岁"), ("小红", "7岁")]
lstHeadData = ["Name", "Age"]
OutputFormat(lstRowData, lstHeadData)
'''
Name| Age
==========
小明| 8岁
小红| 7岁
'''
1万+

被折叠的 条评论
为什么被折叠?



