2017.07.03回顾 matplotlib作两个y轴图形

本文主要介绍了如何使用matplotlib在Python中创建共用一个X轴但有两个Y轴的图形。通过一个定值demo和变量化的实现,展示了图形的绘制过程,并指出了在图形初始化和方法协同作用中需要注意的细节,虽然完成了基本需求,但仍存在一些理解和优化的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天主要是解决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等对象是怎么协同作用的,感觉就是前面每一个方法都会作用于最后的图形展现,信息如何传递?所以还有很多坑需要解决





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值