python数据处理之Matplotlib可视化
声明:仅作自学笔记之效用,是亦可作共享之功用。
经济学分析多用stata(再一般大抵为stataSE),图像处理在数学建模中则多用Matlab,虽然已经下载了Matlab,但是既然python已经有matlab的包,那不如先了解一二,也方便与其他包相适用。此时尚且大一大二而已,自然多有稚嫩。
自学基本内容框架主要来自莫烦python,朋友们也可以直接看他的相关视频。
我就相当于做了个文字稿以及一些自己的思考。
安装准备
我是win10和linux都用了的
win10安装如果是直接charm环境安装可能会报错之类,我是换成了conda环境的。然后提前安装了一个visual studio.
Linux总体比较顺畅,开始出不了图,不过马上解决了,见【基本用法】的第一个例子说明 那部分我提到了解决方案。
我是ubuntu20.04
具体安装看相关教程咯~
我linux上python版本不是最新的,是3.8,无伤大雅~
基本用法(在linux跑的)
我们用numpy做点数据,生成从-1到1五十个点。
x = np.linspace(-1,1,50)
import matplotlib
import matplotlib.pyplot as plt
plt.switch_backend('TkAgg')
import numpy as np
x = np.linspace(-1,1,50)
y = x*2 + 1
plt.plot(x,y)
plt.show()
可能会报错,不要慌,在一个最小化安装的linux里面,我是这么解决的:
在import matplotlib之后输入
matplotlib.use(‘TkAgg’)
然后在终端输入sudo apt-get install python3-tk
问题解决。
不过其实你在终端下载了那个之后,一般就不需要输入matplotlib.use('TkAgg')
了
一定要加
plt.show()
否则不能出图
生成多张图(在linux跑的)
plt.figure()
一个如此指令管理一张图,最后总的只需要一句plt.show()
生成图像就行。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = x*2 + 1
y2 = x**2
plt.figure()
plt.plot(x,y1)
plt.figure()
plt.plot(x,y2)
plt.show()
当然你还可以在指令里面决定figure的序号以及长宽
只需要
plt.figure(num=10,figsize=(8,5))
plt.plot(x,y1)
plt.figure(num=13,figsize=(10,3))
plt.plot(x,y2)
多条线在一张图以及线效果变化(在linux跑的)
基本储备
color='(输入颜色)'
,其中color
可以缩写成c
颜色有哪些?
color参数
k:black
b:blue
g:green
r:red
c:cyan(青色)
m:megenta(品红)
y:yellow
w:white
完整版本
线风格与点标记
装了seaborn扩展的话,在字典seaborn.xkcd_rgb中包含所有的xkcd crowdsourced color names。不过没必要这么多。
以上参考 https://blog.csdn.net/syyyy712/article/details/87426927
例子来了
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = x*2 + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='indianred',linewidth=2.0,linestyle='-.')
plt.show()
so we can see a ‘colourful’ figure.
设置坐标轴
设置坐标轴的取值范围
plt.xlim()
plt.ylim()
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = x*2 + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='indianred',linewidth=2.0,linestyle='-.')
plt.xlim(-2,2)
plt.ylim(-2,10)
plt.show()
坐标轴标签
plt.xlabel()
plt.xlabel('I am y')
plt.ylabel('I am x')
别设置成中文标签,显示不了
坐标轴单位长度
plt.xticks()
注意,新的长度范围最好要大于等于原来你设定的x轴的取值范围
如果新的长度小于原来范围,那么 就如下所示
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = x*2 + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='indianred',linewidth=2.0,linestyle='-.')
plt.xlim(-2,2)
plt.ylim(-2,10)
plt.xlabel('I am y')
plt.ylabel('I am x')
plt.xticks(np.linspace(0,2,5))
plt.show()
注意plt.xticks(np.linspace(0,2,5))
你看,0之前部分没单位点了。
如果新的范围更大呢?
坐标范围随之变大
plt.xticks(np.linspace(-10,2,5))
如果是想为某点处设置文字呢?
plt.xticks()
的另一个用法
plt.yticks([-2,3,5,9,10],
[r'$who$',r'$is$',r'$the$',r'$best$',r'$boy$']
)
第二行可以直接 [‘who’,‘is’,‘the’,‘best’,‘boy’] 但是这样的字体是正方体的比较僵硬,正则表达r'$ $'
的话把字体变成了斜体.
不过注意一下,正则表达不能辨认
空格
,因此空格
要写成\
就是斜杠加一个空格。同样,转置符也可以转符号 比如
\alpha
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-1,1,50)
y1 = x*2 + 1
y2 = x**2
plt.figure()
plt.plot(x,y2)
plt.plot(x,y1,color='indianred',linewidth=2.0,linestyle='-.')
plt.xlim(-1,2)
plt.ylim(-2,10)
plt.xlabel('I am x')
plt.ylabel('I am y')
plt.xticks(np.linspace(-1,2,5))
plt.yticks([-2,3,5,9,10],
[r'$who\ can\ read\ \alpha$',r'$is$',r'$the$',r'$best$',r'$boy$']
)
plt.show()
移动坐标轴
gca
=get current axis
指令plt.gca()
就是选取了坐标轴
spins
是脊梁,也就是坐标那个框的四个框框
你记着上面那个图,对比下面这个
ax = plt.gca()
ax.spines['right'].set_color('indianred')
ax.spines['top'].set_color('red')
ax.spines['left'].set_color('dodgerblue')
ax.spines['bottom'].set_color('darkcyan')
先设置坐标轴用别的轴代替,我们用脊梁代替,然后移动脊梁,妙哉
xaxis.set_ticks_position()
ax.spines['bottom'].set_position(('data',+20))
注意,这个移动bottom是上下移动,不然你移动横轴左右移动 移动个寂寞?然后注意是(('data',+-20))
其中+20
就是上移20
注意一下移动问题
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
x = np.linspace(-1,10,50)
y = x**2
plt.plot(x,y,color='indianred',linewidth=2.0,linestyle='-.')
plt.xlabel('I am x')
plt.ylabel('I am y')
ax = plt.gca()
ax.spines['right'].set_color('indianred')
ax.spines['top'].set_color('red')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',+20))
ax.spines['left'].set_position(('data',+3))
plt.show()
除了
data
来辅助移动,还有outward
,axes
。
其中axes
是定位到百分之多少。这个配合ylim()
使用效果更加
制作图例legend
plt.plot()
里面加label=()
然后再
plt.legend()
比如
plt.plot(x,y1,linestyle=':',color='olive',marker='<',label='shuai')
plt.plot(x,y2,linestyle='-',color='firebrick',marker='1',label='too shuai')
plt.legend()
当然你还可以决定legend的位置
其中如果loc='best'
意味着它自动帮你选择一个最合适的位置(一般是空白的位置)放legend.
自己决定就是upper right
,upper left
,center right
,center left
,lower right
,lower left
如果要传入handles 注意必须要把前面的线段命名为name,
的形式
注意一下加和不加handles的效果
不加 就自动按照上下顺序命名
import matplotlib.pyplot as plt
import numpy as np
import math
x = np.linspace(-3, 3, 50)
y1 = x**6 + x**3 + x**2 - 1
y2 = 5*x**3 + 6*math.e**x + 1
plt.figure()
# set x limits
l1, = plt.plot(x,y1,linestyle=