美文网首页
2018-05-22-用Python画个统计图(二)

2018-05-22-用Python画个统计图(二)

作者: 0xC00005 | 来源:发表于2018-05-23 11:49 被阅读0次

前言

家里面还是断网
图书馆打代码装逼就完事咯~

今天把统计图系列的教程给刷没咯,以后就老老实实写散点图吧

正文

还记得我们上次最后面写的那个统计图嘛?--> 传送门
这一次接着用,炒剩饭就完事咯【其实我是在官方文档里面抄的嘻嘻嘻】

首先我们导入库,使用linspace生成一些可爱的数据,然后分别画一个一次函数和二次函数

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2

接着我们新建一个figure图像窗口,以便把这两条线放在同一个图片上,把一次函数line1设置成红色,宽度为1的虚线,用x/ylim规定一下坐标轴的范围,然后给坐标点和坐标轴命名【上次都写了】

>>> plt.figure()
<matplotlib.figure.Figure object at 0x000001A46C080668>
>>> plt.plot(x, y2)
[<matplotlib.lines.Line2D object at 0x000001A46FEDFCC0>]
>>> plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
[<matplotlib.lines.Line2D object at 0x000001A46FEF0278>]
>>> plt.xlim((-1, 2))
(-1, 2)
>>> plt.ylim((-2, 3))
(-2, 3)
>>> new_ticks = np.linspace(-1, 2, 5)
>>> plt.xticks(new_ticks)
([<matplotlib.axis.XTick object at 0x000001A46F77E6A0>, <matplotlib.axis.XTick object at 0x000001A46F77EFD0>, <matplotlib.axis.XTick object at 0x000001A46F7697F0>, <matplotlib.axis.XTick object at 0x000001A46FEF0DA0>, <matplotlib.axis.XTick object at 0x000001A46FEFD438>], <a list of 5 Text xticklabel objects>)
>>> plt.yticks([-2, -1.8, -1, 1.22, 3],['$really\ bad$', '$bad$', '$normal$', '$good$', '$really\ good$'])
([<matplotlib.axis.YTick object at 0x000001A46F774400>, <matplotlib.axis.YTick object at 0x000001A46F757DD8>, <matplotlib.axis.YTick object at 0x000001A46F774E48>, <matplotlib.axis.YTick object at 0x000001A46FEFD2E8>, <matplotlib.axis.YTick object at 0x000001A46FF050B8>], <a list of 5 Text yticklabel objects>)
>>> plt.xlabel('x-axis')
Text(0.5,0,'x-axis')
>>> plt.ylabel('y-axis')
Text(0,0.5,'y-axis')
Figure_1.png

然后,魔改开始了.....

0x01 不是平面直角坐标系怎么办?

有的眼尖的同学会发现其实我口口声声制作的其实一直不是一个平面直角坐标系......
【平面直角坐标系的坐标轴位置不是在中间吗?】
这个这个其实是可以作弊的,怎么办呢?把上面和右边的坐标轴删掉,然后再把左边和下面的坐标轴移到中间不就完事咯。

plt.gca()

gca = get current axis 【获取当前轴】
使用这个函数可以实例化一个坐标对象并且进行更改,
但是记住理论上不存在plt.gca()这样子的写法,要用请先实例化
这叫实例化:ax = plt.gca()

然后我们就可以着手去修改ax的各种属性和参数辣

.spines['right']

目前有四种字符串给你用:

  • bottom 底端
  • top 顶端
  • left 左边
  • right 右边

如上,更改最右边的那条坐标轴的属性,
或者换句话来说,你已经选择了最右边的那条坐标轴,但是你还没有做任何的更改

PS:spine这个单词是颈椎的意思来着?
抬起你的脊梁骨失去你的鼻梁骨【少女前线恶意玩梗】

.set_color('green')

原谅色多好啊,只要把这一句语句加在一个已经被选择的坐标轴的后面,那么你就可以把这个坐标轴给绿咯【 迫 真 】


好了,需要用的功能都介绍完了,现在到了考验智商的时候,
请问如何使用上面的语句,删除坐标轴?
此处思考十秒~
emmmmmmm


你把坐标轴的颜色设成none不就成了【 迫 真 】
综上,把右边和上面的坐标轴的语句:

  • 先实例化一个ax坐标轴【你要是开心的话可以说颈椎】对象
  • 然后使用“颈椎”命令选择你要消除的轴
  • 把坐标轴的颜色设置为none
  • 不见的坐标轴滚粗个【反正又看不见就当消失咯】
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')

当当当当,坐标轴消失不见嘻嘻嘻


Figure_1-1.png

0x02 更刺激一点,移动整条坐标轴

ax.spines['bottom'].set_position(('data', 0))

把整条x轴移动到0点的位置,
这里设置为data,就是基于数据定位的意思,【其他的我也不知道啊】

同理,把y的那条也移动到y = 0的位置上,一个平面直角坐标系就诞生了


Figure_1-2.png

源码如下:
【其中两个功能我自认为挺没用的所以没写,但是去掉注释以后应该是Figure_1-3,猜都知道是坐标轴上上面的点移动到指定的位置】

import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-3, 3, 50)
y1 = 2*x + 1
y2 = x**2
plt.figure()
plt.plot(x, y2)
plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')
plt.xlim((-1, 2))
plt.ylim((-2, 3))
new_ticks = np.linspace(-1, 2, 5)
plt.xticks(new_ticks)
plt.yticks([-2, -1.8, -1, 1.22, 3],['$really\ bad$', '$bad$', '$normal$', '$good$', '$really\ good$'])
plt.xlabel('x-axis')
plt.ylabel('y-axis')
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
##ax.xaxis.set_ticks_position('top')
##ax.yaxis.set_ticks_position('right')
ax.spines['bottom'].set_position(('data', 0))
ax.spines['left'].set_position(('data',0))
plt.show()

这个是上面的代码去掉两个xaxis.set_position后的演示【毕加索附体】


Figure_1-3.png

0x03 图例

图例肯定是要有的,解应用题怎么能没有图例呢?
说道图例有一点复杂,因为图例这个功能不能再继续堆代码了,需要把前面的plot给拿去大改,而且还有把两条线给实例化了【推荐这么做】
首先我们把两条line都给我实例化咯,接着添加label参数

plt.plot(label = '')

这个属性会赋给当前生成的函数一个name,相当于你在描述什么东西,

line1 = plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--',label = 'A red line')
line2 = plt.plot(x2,y,label = 'A blue line')

这样子的话两个函数【数学意思】的图例就会显示出label里面的内容来着

但是!
但是这样并没有产生图例,还需要一个函数:

plt.legend(loc='place')

这个函数会让当前的figure产生一个图例,但是这个图例并不是固定的,可以随着图片的缩放来改变位置,默认的是图片中数据最少的地方【就是没有函数图像穿过的地方】【mua一口人工智障】
loc里面填写的是位置,会设置默认图例的初始位置,但是如果继续缩放图片的话,图例的位置还是会随着图片而改变的。

将plt.legend放在show前面,我们就可以得到一个带有图例的表
而且还会自动调整图例位置【这也就是为什么我不想写ioc,没这个必要嘛~】


随图片大小调整位置.gif

或者你可以不要去写label,在legend里面多写一点也是可以的,不过也要实例化:

#handles是一个列表,因为有两条线
#label填写名称,ico是位置,best为自动调整,也就是0
plt.legend(handles=[l1, l2], labels=['up', 'down'],  loc='best')

除了best还有许多不同的位置选项可以用来着,

 'best' : 0,          
 'upper right'  : 1,
 'upper left'   : 2,
 'lower left'   : 3,
 'lower right'  : 4,
 'right'        : 5,
 'center left'  : 6,
 'center right' : 7,
 'lower center' : 8,
 'upper center' : 9,
 'center'       : 10,

但是有best干吗不用qwq?

0x04 point一个点

如果想要把两个线段的相交处给重点标注出来,我们可以使用

plt.scatter([x的区间 ], [y的区间, ], s=宽度值, color='')

这个本来是拿来做散点图的,这里被我拿来画点点了嘻嘻嘻
比如说我先画一个在(3,4)的宽度为15,颜色为原谅的点

plt.scatter([3],[4],s=15,color='green')

但是令人蛋疼的一点是,pyplot里面好像并没有直接求两条坐标交点的功能【有的隐函数,二次双曲什么的根本求不出来好吧】
所以只能求一个大概的值
对此作者写了如下【伪】求交点代码

for i in x1:
#因为y在函数外面不好更改,所以用一个临时变量z
    z1 = 2*i+1
    z2 = i**2
    if(abs(z2-z1)<=0.09):
        solution.append(i)
        solution.append(z1)
        solution.append(z2)

绝对值0.09真的真的是最小了,再小就求不出来了啧啧啧
然后我们标记一下这个点【只标记第一个交点,反正你们又看不到第二个嘻嘻嘻】

plt.scatter([solution[0], ], [solution[1]+0.03, ], s=50, color='black')
Figure_1-4.png

然后我们再使用这个函数来把这个点的横纵坐标都标出来,用plot加上两个列表应该就可以把线画到横纵坐标上。

plt.plot([solution[0],solution[0],], [0, solution[1],], '--', linewidth=1.5,color='black')
plt.plot([0,solution[0],], [solution[1]+0.03, solution[1]+0.03,], '--', linewidth=1.5,color='black')

记住不要用scatter【散点图】来画线,所有的线都应该是plot!

Figure_1-5.png

0x05 添加文字注释text

其中-3.7, 3,是选取text的位置, 空格需要用到转字符\ ,fontdict设置文本字体.
【什么α,β什么的临时查就完事咯】

plt.text(-3.7, 3, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
         fontdict={'size': 16, 'color': 'r'})
Figure_1-6.png

0x06 添加箭头annotate

没有箭头怎么行,最好还是要手写化的弯曲的箭头嘻嘻嘻
【那个印象笔记添加注解了解一下】

最后

//并没有写完,没有!
【我怕不是已写断就不想写了咯】
【图书馆断网断电赶人,溜了溜了】
在断网的边缘疯狂试探嘻嘻嘻
不行不行先发布了不然等会儿发出不去了

最后的最后

在断网的边缘疯狂的推广自己的Blog

相关文章

网友评论

      本文标题:2018-05-22-用Python画个统计图(二)

      本文链接:https://www.haomeiwen.com/subject/wdoljftx.html