python
import matplotlib as plt
plt.plot([1,2,3,4,5],[1,2,3,4,5])#传入的是所有坐标点的x坐标,还有就是y坐标
plt.plot([1,2,3,4,5],[1,4,9,16,25],'--',color='b') #'--'代表第二个线用--的方式绘制,color就是线条颜色
plt.xlabel('xaxis','--') #x轴的名称是xaxis,这里可以根据自己需要更改,'--'是线条形状
plt.ylabel('yaxis',fontsize=10) #y轴名称,可以通过fontsize设置字体大小也就是ylabel的大小
plt.show()
上面的代码绘制了两幅图片,第一个绘制的就是一条直线,第二条直觉上是二次函数,但是没有画出来二次函数的感觉,点和点之间也是用直线来绘制的。同时在绘制的时候也不需要考虑图像的大小,matplotlib会自动调整好对应图像的大小。同时指定color和指定线条的形状可以合并为一个字符串即采用下面这种方式,当然k是black的缩写,注意这里颜色只能用缩写。
python
plt.plot([1,2,3,4,5],[1,4,9,16,25],'--k')#
绘制多个图形的时候不用写多个plt.plot(),也就是说可以这么画图:
python
plt.plot([1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,4,9,16,25],'--k')
跟上面画出来的效果是一样的。
使用linewidth来控制线条的宽度
使用marker来控制我们传入点的展示形式
使用markerfacecolor来控制传入点的颜色
alpha控制线条的透明度(实际上就是线条颜色的深浅)。
如果我们之前使用plt设置了一些点,我们现在想该他的格式比方说
python
import matplotlib.pyplot as plt
a=plt.plot([1,2,3,4,5],[1,2,3,4,5],'--',color='red')#传入的是所有坐标点的x坐标,还有就是y坐标
plt.plot()#
plt.xlabel('xaxis')
plt.ylabel('yaxis',fontsize=10)
plt.setp(a,alpha=0.5,linewidth=2,marker='o',markerfacecolor='white',color='black')#更改之前的对象
plt.show()
有的时候我们想要在一个图里面进行对比,这就需要我们把很多图放在一个途中,此时我们可以调用subplot的操作进行绘制
python
x=np.arange(0,10,1)
y=np.sin(x)
plt.subplot(211) #211,代表一个图里面有两行1列,下面要画第一个图也就是第一行的图
plt.plot(x,y,color='black')
plt.subplot(212) #212 是第二个图
plt.plot(x,y,color='red')
plt.show()
有的时候我们想在途中突出一些东西(最高值或者最低值),我们需要在途中对某个点进行标注。
python
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(0,10,1)
y=(x-2)**2
plt.plot(x,y,color='green')
plt.grid(True) #在坐标系绘制网状格子
plt.text(2,0,'small') #标注信息,在(2,0)附近添加一个small的注释
plt.annotate('small',xy=(2,0),arrowprops=dict(color='red',shrink=0.05,headwidth=10,headlength=10))
#箭头强调,arrowprops就是对这个箭头的设置,width宽度,length长度,但是本土箭头没空间了
plt.show()
matplotlib也提供了多种绘图风格供我们使用
python
x=np.arange(0,10,1)
y=(x-2)**2
print(plt.style.available) #查看有什么风格是可以使用的
plt.style.use('_mpl-gallery') #使用特定的风格
plt.plot(x,y)
plt.show()
看看效果吧:
matplotlib也提供了条形图的画法:
python
x=np.arange(0,10,1)
y=(x-2)**2
fig,ax=plt.subplots(ncols=2) #这里只是指明了一行两个子图
v_bars=ax[0].bar(x,y,color='red') #默认情况下目标值是垂直的
h_bars=ax[1].barh(x,y,color='blue') #h代表horizon水平的目标值是水平的
ax[0].axhline(5,color='black',linewidth=2) #在对应的图中画一个水平的线
ax[1].axvline(5,color='black',linewidth=2) #在对应的图中画一个竖直的线
plt.show()
那如果想让画出的线下面的条状图和上面的条状图有区别可以这么写代码。
python
for bar,height in zip(v_bars,y): #这里的bar就是图中的条状图,y就是我们之前的目标值
if height<5: #如果高度也就是对应的y小于线对应的值
bar.set_color('red') #设置一个颜色
else:
bar.set_color('green')
plt.show()
你也可以试试水平朝向的设置bar的值。
如果我们想在两条线段包围的区域填充一些颜色可以使用如下的方法:
python
ax.fill_between(x, y1, y2, color='red') #在y1和y2之间填充红色,不填默认为0
#----------------------------------下面是一个示例
x=np.arange(0,10,1)
y=(x-2)**2-5
print(plt.style.available)
plt.style.use('_mpl-gallery')
plt.plot(x,y)
plt.fill_between(x,y,color='lightblue')
plt.show()
使用matplotlib我们可以让条状图的信息更加丰富一些
python
mean_values=[1,2,3] #代表每个样本的平均值
variance=[0.2,0.3,0.4] #代表每个样本的方差
bar_label=['bar1','bar2','bar3'] #每个样本的名称
x_pos=list(range(len(bar_label))) #每个样本的x坐标用来区别
plt.bar(x_pos,mean_values,yerr=variance) #画出对应的直方图
max_y=max(zip(mean_values,variance)) #获得最大值
plt.ylim([0,(max_y[0]+max_y[1])*1.2]) #让y轴纵坐标可以显示所有的条状图
plt.ylabel('variable y')
plt.xticks(x_pos,bar_label) #设置x轴每个下标的名称就是横坐标原来是1,现在是bar1
plt.show()
效果图:
如果我有两个数据都想用直方图显示怎么办呢,可以考虑用下面的结构:
python
#这种结构要求值得符号必须一样
x1=np.array([4,2,3])
x2=np.array([3,4,1])
y=range(len(x1))
plt.barh(y,x1,color='b')
plt.barh(y,-x2,color='r') #弄成负数去显示
plt.show()
效果:
那假如我有很多组数据呢,可以考虑用下面的方法:
python
y1=np.array([4,2,3])
y2=np.array([3,4,1])
y3=np.array([3,6,8])#对应的三组数据
x=np.array([0,1,2])#第一组的x坐标
width=0.2 #每个条状图的宽度
const_val=0.5 #透明度(就是调节亮度的)
plt.bar(x,y1,color='r',alpha=const_val,width=width) #第一个条状图的x
plt.bar([t+width for t in x],y2,color='g',alpha=const_val,width=width) #跳过一个width也就是
#一个条状图的宽度
plt.bar([t+2*width for t in x],y3,color='b',alpha=const_val,width=width)#跳过两个width
plt.show()
运行结果:
我们可以之前学的试着画一个比较详细的直方图
python
x=np.arange(100,125,5)
y=range(len(x))
y_labels=['a','b','c','d','e']
bar=plt.barh(y,x,color='b')
plt.yticks(y,y_labels)
mn=min(x)
for bar,x in zip(bar,x):
print(bar.get_width()) #获取直方图的宽度,就是在x轴上面占多长
print(float(bar.get_y())) #获取每个条状图最靠下部分的值,比如说第一是-0.4,因为希望中央在#0,同时总长度是0.8,所以最下面的那一部分是-0.4
print(bar.get_height()) #获取条状图在y轴上的长度,这里我们是水平画的所以都是0.8
plt.text(bar.get_width()+bar.get_width()*0.05,bar.get_y()+bar.get_height()/2,f"{(x/mn) * 100:.2f}%") #那么这个标注就很明白了,就是在每个条状图顶部中间加上一个是最小的多少倍
plt.xlim([0,150])
plt.ylim([-1,5])
plt.vlines(mn,-1,max(y)+1,color='k',linestyle='--')
plt.show()
如果我们条形图是上升趋势,然后我们想用一种渐变色来表示这种趋势,我们就可以使用下面的代码。
python
import matplotlib.pyplot as plt
import matplotlib.colors as col
import matplotlib.cm as cm
mean_values=range(0,18)
x_pos=range(len(mean_values))
cmap1=cm.ScalarMappable(col.Normalize(min(mean_values),max(mean_values),cm.hot))#指定一种渐
#变色
cmap2=cm.ScalarMappable(col.Normalize(0,20,cm.hot))#前两个值可以自己指定
plt.subplot(121)
plt.bar(x_pos,mean_values,color=cmap1.to_rgba(mean_values))
plt.subplot(122)
plt.bar(x_pos,mean_values,color=cmap2.to_rgba(mean_values))
plt.show()
如果想让条形图里面填充自己想要的符号
python
import matplotlib.pyplot as plt
y=[3,2,9,6,5]
x=range(len(y))
pattern=['x','\\','//','.','o'] #设置填充格式
bars=plt.bar(x,y)
for bar,pattern in zip(bars,pattern):
bar.set_hatch(pattern)
plt.show()
matplotlib绘制盒图
首先这里阐明一下盒图的用处
①:通过盒图,可以观察数据是否呈现偏态,帮助分析人员判断数据是否符合正态分布。
②:盒图能够直观地展示数据的中位数、上下四分位数及最大值和最小值,从而帮助理解数据的分布形态。
③:盒图可以帮助识别数据中的异常值(即离群值),这些值通常被表示为单独的点。
python
import numpy as np
import matplotlib.pyplot as plt
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
plt.boxplot(data,notch=False,sym='s',vert=True) #传入的参数的含义依次是:传入的数据、是否有缺口、离群点的表示形势、是否垂直放置
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
plt.show()
小提琴图:
通过小提琴图,可以很快的得知数据的具体分布情况(哪里分布多,哪里分布较少),同时也可以知道数据的中位数以及上下限(方便判断离群点)。
python
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
plt.violinplot(data,showmedians=True) #是否标记中位数
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
plt.show()
通过这两个操作可以把对应的顶部和右边的边界去掉
python
data=[np.random.normal(0,std,100) for std in range(1,4)]#生成三组满足(0,std)的正态分布
fig=plt.figure(figsize=(8,6)) #图行大小
ax=plt.subplot(111)
plt.violinplot(data,showmedians=True) #是否标记中位数
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)])
ax.spines['top'].set_visible(False)#隐藏顶部的边界
ax.spines['right'].set_visible(False)#隐藏右边的边界
plt.show()
python
plt.xticks(range(1,len(data)+1),[f'x{i}' for i in range(1,4)],rotation=45)#可以x1设置旋转角度
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(10)
for i in range(1,4):
plt.plot(x,i*x**2,label=f"Group {i}") #label代表这条线的实际含义
plt.legend(loc="best") #legend代表显示每条线对应的含义,loc代表放在图片的哪个位置
plt.show()
如果想让对应的 提示信息框在外面可以这样写
plt.legend(loc="upper center",bbox_to_anchor=(0.5,1.15),ncol=3)#bbox代表放在哪个位置,ncol=3代表3个group并排写,loc代表和当前图片居中
如果我们实在想把对应的标签放在右上角,那么我们就可以设置对应的标签的透明度,比如下面的
plt.legend(loc='upper right',framealpha=0.01)#设置标签透明度
x=np.random.randint(0,40,1000)
print(np.bincount(x))
plt.hist(x,bins=40,edgecolor='white',color='orange')#绘制的直方图显示的是每个值出现了几次,edgecolor代表每个条状图之间用什么分割(不然就连在一块了),color代表每个柱的内部颜色是什么
plt.show()
bins代表的是把这个数值区间我分成几份来表示(下图就是每个值对应一份).
如果设置bins=2
matplotlib绘画散点图
x_coords=[0.13,0.22,0.39,0.59,0.68,0.74,0.93]
y_coords=[0.75,0.34,0.44,0.52,0.80,0.25,0.55]
plt.figure(figsize=(8,6))
plt.scatter(x=x_coords,y=y_coords,s=10) #s代表每个点的面积
for x,y in zip(x_coords,y_coords):
plt.annotate(f"{x,y}",xy=(x,y),xytext=(0,-15),textcoords='offset points',ha='center')#xytext代表这个文本的相对位置,然后textcoords='offset points'就是相对绘制的我们给的(x,y)来说的偏移,指明xytext是相对于谁来说的,ha代表怎么对齐
plt.show()
import matplotlib.pyplot as plt
import numpy as np
fig=plt.figure()
ax=fig.add_subplot(111,projection='3d') #画三维图
theta = np.linspace(-4*np.pi, 4*np.pi, 100)
z=np.linspace(-2,2,100)
r=z**2
x=r*np.sin(theta)
y=r*np.cos(theta)
ax.plot(x,y,z)
plt.show()
3D绘制条形图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]):
xs = np.arange(20)
ys = np.random.rand(20)
print(ys.shape)
cs = [c] * len(xs)
ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.5) #zs就是条形图在z轴哪个坐标下,zdir就是条形图向哪个方向延申。
plt.show()