今天主要是解决python绘图的问题,基本上是完成了一个可以交付的图形,像这样
也就是共用一个x轴,有两个y轴,我参照matplotlib官方的example,写了个定值的demo,然后结合自己的程序,也了一个变量化的,先看看demo
fig, ax1 = plt.subplots() #生成一个图对象,一个坐标对象
#fig.subplots_adjust(left=0.2, right=0.9, top=0.5, bottom=0.1) #这里是用于调整margin,我其实当时是在尝试解决padding的调整问题
ax1.set_ylabel('count', color='y') #y轴名称叫count,颜色是黄色
ax1.tick_params('y', colors='y') #y轴刻度也是黄色,第一个参数'y',我没深究
count = [579,258,538,298,248,219] #直方图长度
x = range(len(count)) #必须生成一个自增序列x
ax1.bar(x,count ,tick_label = ('unknown', '0-1', '1-3', '3-5', '5-10','10+'),color = 'y',align = 'center') #画柱状图,x值、y值、x轴刻度标记名、颜色、刻度标记名居中
#画逾期率
br_data = [0.043,0.062,0.054,0.067,0.024,0.037] #另一个y值
ax2 = ax1.twinx() #复制一个共用x的坐标轴
ax2.plot(x,br_data,color='r') #画折线图
ax2.set_ylabel('bad_rate', color='r') #第二条y轴名称
ax2.tick_params('y', colors='r') #第二条y轴颜色
plot_margin = 0.25 #常数用于padding的设置
print ax1.axis()
x0, x1, y0, y1 = ax1.axis() #这个生成的是ax1的x最小和最大刻度,y最小和最大刻度
ax1.axis((x0 - plot_margin, #ax1.axis改变x轴和y轴的范围,这样就可以有padding了
x1 + plot_margin, #PS:开始我只我直方图的时候会自动留白左右,上面是顶满,把折线加进来就左右留白都没有了,但是第二个y值
y0 - 0, # 最大最小刻度是大于本身的值域,后来搜了半天才找到这个解决方案
y1 * 1.1))
plt.show() #显示图片
有了上面这个定值的研究,就可以着手变量化了,难度不大,但是有几个需要注意的地方
def create_chart(woe_dicts,column):
woe_lists = sorted(woe_inst.woe_dicts[column].items(),key = lambda item:item[0])
tick_label = [i[0] for i in woe_lists] #取每一个item固定位置元素重组成list的方法
counts = [i[1][1] for i in woe_lists]
br_data = [i[1][2] for i in woe_lists]
x = range(len(counts))
fig, ax1 = plt.subplots()
plt.xticks(x,tick_label,rotation = 60) #这里和上面不同,不再是生成bar的时候写明xlabel,而是用了一个plt.xticks,可以加一个旋转xlabel角度的参数,为了能容纳比较长的xlabel
ax1.set_ylabel('count', color='y') #要注意的地方是这个方法只能用在前面,我开始用在后面不生效,具体位置不清楚,没深究,尽可能前吧,属于坐标轴设置等工作,应该靠前
ax1.tick_params('y', colors='y')
ax1.set_ylabel('count', color='y')
ax1.tick_params('y', colors='y')
ax1.bar(x,counts,color = 'y',align = 'center')
ax2 = ax1.twinx()
ax2.plot(x,br_data,color='r')
ax2.set_ylabel('bad_rate', color='r')
ax2.tick_params('y', colors='r')
plot_margin = 0.25
x0, x1, y0, y1 = ax1.axis()
ax1.axis((x0 - plot_margin,
x1 + plot_margin,
y0 - 0,
y1 * 1.1))
plt.show()
仍然要用到dict排序,使用的是
woe_lists = sorted(woe_inst.woe_dicts[column].items(),key = lambda item:item[0])
woe_inst.woe_dicts[column]是一个dict,dict.items()方法是生成一个list,元素是tuple,tuple含key和value两个元素,排序方法sorted第二个参数key跟一个lambda函数,取前面list的item第一个元素,也就key。
以上已经可以完成需要的图形,不做进一步美化了,更多的精力应该放在建模上,但是今天虽然基本完成,还是有不少问题,关于图形初始化的不同方法,个别方法和参数不清楚,plt、axis、flg等对象是怎么协同作用的,感觉就是前面每一个方法都会作用于最后的图形展现,信息如何传递?所以还有很多坑需要解决