其实python本身有数据结构
ndarray可以理解为一个矩阵,相当于存储了一些我们需要的数据。
x=np.loadtxt('000001.csv',delimiter=',',skiprows=1,usecols=(1,4,6),unpack=False)
# delimiter,定界符,分隔符,分界符。skiprow,跳行(由于第一行不是数据,所以要跳过)。usecol,用哪几列。unpack,不把导入的这些放到一个array里面,放到不通过array里面。
x
x.shape
# unpack=True,将数据放到不同array中
x=np.loadtxt('000001.csv',delimiter=',',skiprows=1,usecols=(1,4,6),unpack=True)
open
open.shape
# 与python操作相同
print c[1:5]
print c[:5]
print c[5:]
# 加上步长
print c[::-1]
import numpy as np
c=np.random.randint(1,100,10)
c_sort=np.sort(c)
print(c_sort) # 有值,说明生成了新的array
print(c.sort())# None,无值,说明没成新的array。原来的araay发生变化
print(c)
import numpy as np
x=np.random.randint(1,100,10)
np.savetxt('testfile.txt',x) #保存x到文件testfile.txt中
c=np.loadtxt('testfile.txt') #凑够文件导入数据
c_sort=np.sort(c)
highest=np.max(c)
lowest=np.min(c)
mean=np.mean(c)
import numpy as np
import matplotlib.pyplot as plt
height=[161,170,182,175,173,165]
weight=[50,58,80,70,69,55]
plt.scatter(height,weight) #hegiht是x轴,weight是y轴
plt.show()
import numpy as np
import matplotlib.pyplot as plt
N=1000
x=np.random.randn(N)
y1=np.random.randn(len(x))
plt.scatter(x,y1)
plt.show()
N=1000
x=np.random.randn(N)
y=x+np.random.randn(N)*0.5
plt.scatter(x,y1)
plt.show()
负相关就是在y那里加上一个负号。
# 读取表中的开盘价open和收盘价close,分别读到连个array中
open,close=np.loadtxt('000001.csv',delimiter=',',skiprows=1,usecols=(1,4),unpack=True)
change=close-open #每日开盘价和收盘价之间的差价
yesterday=change[:-1] #取第一个值到倒数第二个值。前一天的价格涨幅序列
today=change[1:] # 取第二个值到最后一个值。后一天的价值涨幅序列
plt.scatter(today,yesterday)
plt.show()
# 颜色,c。点大小,s,面积的意思。透明度,alpha。点形状,marker
plt.scatter(today,yesterday,s=100,c='r',marker='<',alpha=0.5,)
# 查看marker有多少种,去官网看下。
# 在同一个图中画多个。要用不同颜色和不同形状将其区分开
查看marker有多少种
https://matplotlib.org/api/markers_api.html?highlight=marker#module-matplotlib.markers
Pycharm功能强大,直接显示出备选参数
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
x=np.linspace(-10,10,100) #np.linespace()函数,生成等距离的点
y=x**2
plt.plot(x,y) #.plot默认画出的就是折线图
plt.show()
# 用到日期数据作为x轴输入。日期数据要转化为matplotlib可识别的日期数据
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
date,open,close=np.loadtxt('000001.csv',delimiter=',',converters={0:mdates.bytespdate2num('%m/%d/%Y')},skiprows=1,usecols=(0,1,4),unpack=True)
# mdates.bytespdate2num('%m/%d/%Y'),将'%m/%d/%Y'格式的字符串时间转化为matplotlib可识别的日期。不同文件中的日期格式不同,要针对不同格式写不同的格式化字符串。
plt.plot(date,open) #结果图,x轴是数字形式,不是日期形式。
# mdates.bytespdate2num('%m/%d/%Y')函数将date转换为matplotlib可识别的,实质上是将str形式转换为float形式。这里的date是float
# 要将float形式的date显示为时间形式.plot_date()函数专门绘制有一个轴是时间的。
# 程序可以自动识别为date,并将其转换为时间
plt.plot_date(date,open) #结果不是折线图而是点图。plt.plot_date()默认是点图
# 添加参数,设定图的样式.
# 参数有线型linestyle,颜色color,点形状marker(标记),
plt.plot_date(date,open,'y-')
# 设定其他参数
plt.plot_date(date,open,linestyle='-',color='red',marker='o')
# 一次画两条线,就是两个画线函数同时写
plt.plot(date, open, color='red', linestyle='-', marker='o', markerfacecolor='yellow', markersize=12)
plt.plot(date, close, color='green', linestyle='--', marker='o',
markerfacecolor='blue', markersize=12)
plt.show()
这里关于mdates.strpdate2num(’%m/%d/%Y’)函数的使用要注意:
plt.plot(date,open) #结果图
plt.plot_date(date,open) 结果图:
plt.plot_date(date,open,linestyle=’-’,color=‘red’,marker=‘o’)结果图
一次画两条线,就是两个画线函数同时写结果图
参考:https://www.cnblogs.com/zyg123/p/10504637.html
import numpy as np
import matplotlib.pyplot as plt
N=5
y=[20,10,30,25,15]
index = np.arange(N)
p1 = plt.bar(x=index, height=y)
plt.show()
p1 = plt.bar(x=index, height=y,width=0.5,bottom=100,color='red')
# width=0.5,柱状的宽度。
plt.show()
将纵向柱状图画为横向柱状图
需要把:orientation=“horizontal”,然后x,与y的数据交换,再添加bottom=x,即可。
p1 = plt.bar(x=index, height=y,width=0.5,bottom=100,color='red',orientation='horizontal')
# orientation='horizontal',orientation方向,柱状图的方向。
# 结果出错,问题出在:条形图的方向由纵向变为横向,x不再是图的横坐标,而是纵坐标,不将x作为index。
#改正。看起来很绕,但这正是灵活性的体现
p2 = plt.bar(x=0, bottom=index, width=y,color='red',height=0.5,orientation='horizontal')
plt.show()
#或者直接用barh()绘制
#plt.barh(y,width)绘制水平直方图,y:y轴上的位置,width:宽度,即每个直方图具体的数值
plt.barh(y=index,width=y)
出错的图
p2 = plt.bar(x=0, bottom=index, width=y,color=‘red’,height=0.5,orientation=‘horizontal’)结果
plt.barh(y=index,width=y)结果图:
import numpy as np
import matplotlib.pyplot as plt
index=np.arange(4)
sales_BJ=[52,55,63,53]
sales_SH=[44,66,55,41]
bar_width=0.3
plt.bar(index,sales_BJ,bar_width,color='b')
#上面,先画出一个条形图,bar(index,sales_BJ,bar_width,color='b')
plt.bar(index+bar_width,sales_SH,bar_width,color='r')
# 下面,再画一个bar。index+bar_width,x轴向右平移一个bar_width举例。
#要再加上bar,那就再往后加index+bar_width+bar_width
plt.bar(index,sales_BJ,bar_width,color=‘b’)
plt.bar(index,sales_BJ,bar_width,color=‘b’)
plt.bar(index+bar_width,sales_SH,bar_width,color=‘r’)
import numpy as np
import matplotlib.pyplot as plt
index=np.arange(4)
sales_BJ=[52,55,63,53]
sales_SH=[44,66,55,41]
#先画一个bar
plt.bar(index,sales_BJ,bar_width,color='b')
#下一个bar,高度直接从sales_BJ开始,即底部为bottom=sales_BJ。
plt.bar(index,sales_SH,bar_width,color='r',bottom=sales_BJ)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
index=np.arange(5)
sales_BJ=[52,55,63,53,40]
sales_SH=[44,66,55,41,30]
bar_width=0.3
plt.barh(y=index,width=sales_BJ,height=bar_width,color='b')
plt.barh(y=index+bar_width,width=sales_SH,height=bar_width,color='r')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
index=np.arange(5)
sales_BJ=[52,55,63,53,40]
sales_SH=[44,66,55,41,30]
bar_width=0.3
plt.barh(y=index,width=sales_BJ,height=bar_width,color='b')
plt.barh(y=index,width=sales_SH,left=sales_BJ,height=bar_width,color='r')
# 横向层叠图的关键是left=sales_BJ
plt.show()
举例说明:
import numpy as np
import matplotlib.pyplot as plt
mu = 100 # mean of distribution
sigma = 20 # standard deviation of distribution
x = mu + sigma * np.random.randn(2000)
# 随机生成2000个数据,均值为100,方差为20
plt.hist(x, bins=10,color='red',normed=True)
#bins=10,将连续数据分为10组等大小区间。normed=True,是否进行标准化。
#进行标准化后,每个区间对应的y轴不是出现的个数,而是出现的频率:即每个区间对应的个数除以总个数。
plt.hist(x, bins=50,color='green',normed=False)
# normed=False,没有进行标准化,每个区间对应的是个数。
# 只要样本数量足够大,分组数量足够多,这个直方图会越来越接近一条曲线。样本数量无穷大,分组数量无穷多时,直方图就是总体密度曲线。
plt.show()
现在尝试增大样本数量,增加分组个数
只要样本数量足够大,分组数量足够多,这个直方图会越来越接近一条曲线。样本数量无穷大,分组数量无穷多时,直方图就是总体密度曲线。
import numpy as np
import matplotlib.pyplot as plt
mu = 100 # mean of distribution
sigma = 20 # standard deviation of distribution
x = mu + sigma * np.random.randn(20000)
plt.hist(x, bins=1000,color='green',density=False)
plt.show()
除了单变量直方图以外,还可以绘制双变量的联合的频率分布直方图。
在双变量的联合的频率分布直方图中,不是用y轴高度表示频率大小,而是用颜色深浅表示频率大小。
用来探索双变量的联合分布。
x = np.random.randn(1000)+2 #x的均值为2
y = np.random.randn(1000)+3 #y的均值为3
plt.hist2d(x, y, bins=40) #plt.hist2d()函数
plt.show()
x轴横坐标对应的中间点差不多是2,y轴纵坐标对应的中间点差不多是3.用颜色深浅表示频率大小。越往中间,频率越高,颜色越亮。
import matplotlib.pyplot as plt
labels = 'A', 'B', 'C', 'D'
fracs = [15, 30, 45, 10]
plt.pie(x=fracs, labels=labels) #x=fracs,数据。labels,数据对应的标签。
plt.show()
explode = (0, 0.05, 0, 0)
plt.pie(x=fracs, labels=labels,autopct='%.0f%%',explode=explode,shadow=True) #autopct,autopercent,将每一块所占的比例用python的格式化字符串或一个函数来表现出来,%.0f%%表示精确到百分数的整数位,%.1f%%表示精确到百分数后一位。explode,对应数据标签,每个数值代表举例圆中心的距离。shadow,阴影,增加立体感。
plt.show()
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
plt.boxplot(data,sym='o',whis=1.5)
# 参数:sym='o',调整异常值数据点的形状。whis=1.5,代表边缘中间线的长度,比如希望将异常值纳入到边缘中,那就将whis调大,边缘中的线调长。whis默认是1.5,是比例值。
plt.show()
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(100, 4), loc=0.0, scale=1.0)
# 生成4*1000的array。
labels = ['A','B','C','D']
plt.boxplot(data, labels=labels)
plt.show()
举例说明
import numpy as np
import matplotlib.pyplot as plt
#默认情况
y=np.arange(1,5)
plt.plot(y)
plt.show()
调整颜色
import numpy as np
import matplotlib.pyplot as plt
# 为了区分开这些线,给了一些位移
y=np.arange(1,5)
plt.plot(y,'y');
# y为黄色
plt.plot(y+1,color=(0.1,0.2,0.3));
#颜色:RGB元组,
plt.plot(y+2,'#FF00FF');
#颜色:html 十六进制
plt.plot(y+3,color='0.5')
#颜色:灰色阴影,写上一个数字画出来的线就是一条灰色的线,数字代表颜色深度。
plt.show()
十六进制和RGB形式表示颜色,如何知道这个颜色的代码是多少
网上搜索,输入颜色代码,有许多查询颜色代码的工具
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,marker='o');
# 指定marker时会默认指定线段,不指定marker只画出一个点
plt.plot(y+1,'D');
plt.plot(y+2,'^');
plt.plot(y+3,'p');
plt.show()
看图发现:除了第一条i线之外,其他线只有点没有线段,是因为第一个有marker,即指定marker时会默认指定线段。
没有指定颜色,但是仍然显示了不同颜色。matplotlib中使用不同点时,默认要在同一幅图中画不同数据,自动显示不同颜色。颜色排序按照8种内建默认颜色的顺序排序。
举例说明:线样式
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,'--');
plt.plot(y+1,'-.');
plt.plot(y+2,':');
plt.show()
样式字符串
可以将颜色,点型,线型写成一个字符串,一个字符串可以同时表示颜色,点型,线型 。三个参数依次排列
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,'cx--');
plt.plot(y+1,'kp:');
plt.plot(y+2,'mo-.');
plt.show()
总结,实战中综合使用pyplot和OO方式,显示导入numpy。
常用模块导入代码:
import matplotlib.pyplot as plt
import numpy as np
#pylab
from pylab import * #是从pylab种导入所有函数,就是把numpy和pyplot中函数都导入进来。后面使用时就不用再加上前缀plt.plot(),np.arange(),而是直接使用。
x=arange(0,10,1)
y=randn(len(x))
plot(x,y)
title('random numbers')
show()
这种用法就跟matlab一样。
#pyplot
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
plt.plot(x,y)
plt.title('pyplot')
plt.show()
把上面代码改成面向对象方式
#Object Oriented
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
# 先生成一个figure对象:画布对象或一张图对象
fig=plt.figure()
# 生成坐标轴对象,fig.add_subplot:在这个画布上画图,生成坐标轴对象
ax=fig.add_subplot(111)
# 画图
l,=plt.plot(x,y)
# 设定图标题
t=ax.set_title('object oriented')
plt.show()
对ax=fig.add_subplot(111),l,=plt.plot(x,y)的说明:
https://www.jianshu.com/p/7b68e01952b4
利用面向对象,在同一幅图上画多个子图。可以用来对比
面向对象方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,100)
plt.subplot(221)
plt.plot(x,x)
plt.subplot(222)
plt.plot(x,-x)
plt.subplot(223)
plt.plot(x,x*x)
plt.subplot(224)
plt.plot(x,np.log(x))
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,100)
plt.subplot(221)
plt.plot(x,x)
plt.subplot(222)
plt.plot(x,x*x)
子图–subplot是一张图上生成多个子图,多图–figure是直接生成多个图
import matplotlib.pyplot as plt
fig1=plt.figure()
ax1=fig1.add_subplot(111)
ax1.plot([1,2,3],[3,2,1])
fig2=plt.figure()
ax2=fig2.add_subplot(111)
ax2.plot([1,2,3],[1,2,3])
plt.show()
两种方式:plt的函数和面向对象
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,y*2)
plt.grid(True)
plt.show()
#交互中打开关闭网格
plt.grid()
对网格进行定制
import numpy as np
import matplotlib.pyplot as plt
y=np.arange(1,5)
plt.plot(y,y*2)
plt.grid(True,color='g',linestyle='-',linewidth='2')
plt.show()
#Object Oriented
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y)
ax.grid(color='g')
plt.show()
注意:用面向对象的方式是没有交互效果的。在console中操作时,用plt方式每操作一步,都会有实时变化,而在面向对象过程中,操作一步不会有实时变化。因而,plt在console交互式模式下用的多,在脚本中使用面向对象。
plt方式和面向对象方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal') #名字用label代表
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
# 前面命名了,这里不写显示图例的话,还是不显示出来。
plt.legend(loc=0,ncol=3)
#图例参数:loc(loction),1,左上角,2,右上角,3,左下角,4,右下角。数字和loc的对应,官网可查到。
# ncol,图例按照几列显示。
plt.show()
loc和数字的对应:https://matplotlib.org/api/legend_api.html?highlight=legend#module-matplotlib.legend
将label写到legend里面
plt.plot(x,x*2)
plt.plot(x,x*3)
plt.plot(x,x*4)
plt.legend(['Normal','Fast','Faster'])
plt.show()
#OO
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(0,10,1)
y=np.random.randn(len(x))
fig=plt.figure()
ax=fig.add_subplot(111)
l,=plt.plot(x,y) #画线
# 方法1:画legend
ax.legend(['ax legend'])
#方法2:画legend
line, =ax.plot(x,y,label='Inline label')
ax.legend()
#方法3:
line.set_label('label via method')
ax.legend()
plt.show()
举例2
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
plt.legend(bbox_to_anchor=(0,1,1,0.1),loc=3,ncol=3,mode="expand")
#
plt.show()
方法1
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
plt.legend(bbox_to_anchor=(0,1,1,0.1),loc=3,ncol=3,mode="expand")
plt.axis() #显示x、y轴坐标
plt.axis([-5,5,20,60]) #调整坐标范围,就是直接给坐标赋值,传递一个数组
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,11,1)
y=x*x
plt.plot(x,x*2,label='Normal')
plt.plot(x,x*3,label='Fast')
plt.plot(x,x*4,label='Faster')
plt.legend(bbox_to_anchor=(0,1,1,0.1),loc=3,ncol=3,mode="expand")
# 方法2的子方法1
plt.xlim([-5,5]) #单个轴调整,可以只调整一个坐标轴
plt.ylim([0,60]) #
#方法2的子方法2
plt.xlim(xmin=-5,xmax=5) #
plt.xlim(xmin=-5) #只调整x轴的一边
plt.show()
将刻度调整得更密集或者更宽松
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(1,11,1)
plt.plot(x,x)
#获取当前图形的坐标轴,get current axis。
ax = plt.gca()
# 调整坐标轴需要用到一个函数:ax.locator_params()
ax.locator_params(nbins=10,)
#nbins=10,刻度个数。
# 只调整x轴不调整y轴,进行指定
ax.locator_params('x',nbins=10)
对比面向对象方式
plt.locator_params('x',nbins=10)
ax.locator_params('y',nbins=10)
画时间序列的图,横坐标不是数字而是日期
# 面向对象方式
import matplotlib.pyplot as plt
import matplotlib as mpl
import numpy as np
import datetime
fig=plt.figure()
start=datetime.datetime(2015.1.1) #日期的开始
stop=datetime.datetime(2016.1.1) #日期的结束
delta=datetime.timedelta(days=1) #日期的间隔
# mpl.dates.drange()函数生成matplotlib识别的dates序列。
dates=mpl.dates.drange(start,stop,delta)
y=np.random.rand(len(dates))
# 获取当前的坐标对象
ax=plt.gca()
#plot_date()绘制时间序列图形
ax.plot_date(dates,y,linestyle='-',marker='')
plt.show()
有几个问题需要考虑:1,x轴的日期在图像很小时会重合,
调整坐标轴刻度
y=np.random.rand(len(dates))
# 获取当前的坐标对象
ax=plt.gca()
#plot_date()绘制时间序列图形
ax.plot_date(dates,y,linestyle='-',marker='')
#调整坐标轴刻度的格式,如果要去掉天,就在()中去掉%d
date_format=mpl.dates.DateFormatter('%Y-%m-%d')
# 将调整好的date_format应用到坐标轴上
ax.xaxis.set_major_formatter(date_format)
#避免刻度重叠
fig.autofmt_xdate() #坐标刻度根据图形大小自适应,自适应会调整大小和角度
plt.show()
画图时将坐标轴刻度设置成向内方向,设置背景网格线为虚线
https://blog.csdn.net/qq_41821678/article/details/105803150
在一个平面图中画两条线,不同的线对应的刻度不同,双坐标轴
pyplot方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(2,20,1)
y1=x*x
y2=np.log(x)
plt.plot(x,y1)
#添加一条坐标轴
plt.twinx() #添加坐标轴,刻度默认是从0到1
plt.plot(x,y2,'r')
plt.show()
面向对象方式
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(2,20,1)
y1=x*x
y2=np.log(x)
fig=plt.figure()
ax1=fig.add_subplot(111)
ax1.plot(x,y)
ax1.set_ylabel('Y1')
ax1.set_xlabel('Compare Y1 and Y2')
ax2=ax1.twinx()
ax2.plot(x,y2,'r')
ax2.set_ylabel('Y2')
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(2,20,1)
y1=x*x
y2=np.log(x)
plt.plot(y1,x)
plt.twiny()
plt.plot(y2,x.color='r')
plt.show()
在图形上强调某个地方,给别人信息提示
annotate,注释;给…作注释或评注
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-10,11,1)
y=x*x
plt.plot(x,y)
plt.annotate('this is the bottom',xy=(0,1),xytext=(0,20),arrowprops=dict(facecolor='g',headlength=10,headwidth=10,width=5))
# 'this is the bottom',箭头名。xy=(0,1),箭头头部位置,xytext=(0,20),箭头尾部位置,也是箭头名位置。arrowprops,调整箭头自身的属性。
#arrowprops=dict(facecolor='g',headlength=10,headwidth=10,width=5)),facecolor箭头颜色;headlength,箭头头部长度;headwidth=10箭头宽度;width=5箭头宽度。
plt.show()
在图中只有纯文字标注,不再有箭头。
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-10,11,1)
y=x*x
plt.plot(x,y)
# 只有纯文字标注,plt.text()函数
plt.text(-2,40,'function:y=x*x',family='serif',size=20,color='r',style='italic',weight=100)
#0,40是位置。
#文字标注的属性参数
plt.text(-2,20,'function:y=x*x',family='fantasy',size=20,color='g',style='obliqu',weight='light',bbox=dict(facecolor='r',alpha=0.2))
#family,字体,官方网站可查到字体种类。size,字体大小。style,字体是否倾斜。weight,字体加粗,用数字或者文字。bbox,文字外面加方框,bbox=dict(facecolor='r',alpha=0.2)颜色,透明度。
plt.show()
参考:https://matplotlib.org/tutorials/text/mathtext.html
在word中编辑数学公式,不容易,因为有很多奇怪的符号。Matplotlib很好地解决了这个问题,因为用了Tex公式。
import matplotlib.pyplot as plt
fig=plt.figure()
ax=fig.add_subplot(111)
ax.set_xlim([1,7])
ax.set_ylim([1,5])
# 面向对象方式
ax.text(2,4,r"$ \alpha_i \beta_j \pi \lambda \omega $",size=25)
# 位置是2,4。然后是python的字符串,r""代表字符串不转译,将所有字符视为字符本身,主要是针对反斜杠转义字符。
# 在官网上查看数学公式所代表的符号。
ax.text(4,4,r"$ sin(0)=cos(\frac{\pi}{2})$",size=25)
ax.text(2,2,r"$ \lim_{x \rightarrow y} \frac{1}{x^3}$",size=25)
# lim_,这个下划线会自动识别是在右下角还是在正下方。
ax.text(4,2,r"$ \sqrt[4]{x} = \sqrt[2]{y}$",size=25)
plt.show()
给一块白块区域上色
plt.fill()填充的是曲线和x轴之间的区域
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(0,5*np.pi,1000)
y1=np.sin(x)
y2=np.sin(2*x)
plt.plot(x,y1)
plt.plot(x,y2)
# 填充颜色,plt.fill()填充的是曲线和x轴之间的区域
plt.fill(x,y1,'b',alpha=0.3)
plt.fill(x,y2,'r',alpha=0.3)
# 为了将上面两个都显示出来,更改透明度
plt.show()
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(0,5*np.pi,1000)
y1=np.sin(x)
y2=np.sin(2*x)
fig=plt.figure()
ax=plt.gca() #得到现在的坐标轴
ax.plot(x,y1,x,y2,color='black')
#fill_between
ax.fill_between(x,y1,y2,facecolor='blue')
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(0,5*np.pi,1000)
y1=np.sin(x)
y2=np.sin(2*x)
fig=plt.figure()
ax=plt.gca() #得到现在的坐标轴
ax.plot(x,y1,color='r')
ax.plot(x,y2,color='b')
# 在哪里填充,加上参数where;interpolate=True参数将两条曲线之间的离散点上空白部分填充
ax.fill_between(x,y1,y2,where=y1>y2,facecolor='yellow',interpolate=True)
ax.fill_between(x,y1,y2,where=y2>y1,facecolor='green',interpolate=True)
plt.show()
生成图形的matplotlib.patches官方文档,https://matplotlib.org/api/patches_api.html?highlight=patch#module-matplotlib.patches
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
#生成一个图
fig, ax=plt.subplots()
# 给定图的坐标,即图的位置.图的中心坐标
xy1=np.array([0.2,0.2])
# mpatches.Circle()函数,参数:xy1是位置,0.1是半径
circle=mpatches.Circle(xy1,0.1)
# 生成了这个图对象,要把这个图放到画布上去
ax.add_patch(circle)
# 结果生成的图不是一个正圆形。是因为x轴和y轴的坐标比例不正确。
# 调整x轴和y轴比例
plt.axis('equal')
# 添加网格
plt.grid()
plt.show()
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
#生成一个图
fig, ax=plt.subplots()
# 给定图的坐标,即图的位置.
xy1=np.array([0.2,0.2])
xy2=np.array([0.2,0.8])
xy3=np.array([0.8,0.2])
xy4=np.array([0.8,0.8])
#画圆形
# mpatches.Circle()函数,参数:xy1是位置,0.1是半径
circle=mpatches.Circle(xy1,0.1)
# 生成了这个图对象,要把这个图放到画布上去
ax.add_patch(circle)
# 结果生成的图不是一个正圆形。是因为x轴和y轴的坐标比例不正确。
# 调整x轴和y轴比例
#画长方形
rect=mpatches.Rectangle(xy2,0.2,0.1,color='r')
#方形的坐标代表的不是中心的位置,而是左下角点的位置
ax.add_patch(rect)
#画多边形,mpatches.RegularPolygon()函数,参数:位置,几条边,半径长度(即圆心到每个顶点的长度)。
# 多边形的边特别多,无穷多时,就类似于一个圆
polygon=mpatches.RegularPolygon(xy3,5,0.1,color='g')
ax.add_patch(polygon)
#画椭圆.参数:位置即圆心.长直径和短直径。
ellipse=mpatches.Ellipse(xy4,0.4,0.2,color='y')
ax.add_patch(ellipse)
plt.axis('equal')
# 添加网格
plt.grid()
plt.show()
举例说明
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')
fig, axes=plt.subplots(ncols=2,nrows=2) #生成2行2列的4个子图
ax1, ax2, ax3, ax4 = axes.ravel()
#画第一个图
x, y=np.random.normal(size=(2,100))
ax1.plot(x,y,'o')
#画第二个图
x=np.arange(0,10)
y=np.arange(0,10)
ncolors=len([u'b',u'g',u'r',u'c',u'm',u'y',u'k']) #plt.rcParams['axes.color_cycle']表示产生
# 颜色的循环[u'b',u'g',u'r',u'c',u'm',u'y',u'k']对七种颜色依次画出线
shift=np.linspace(0,10,ncolors)
for s in shift:
ax2.plot(x,y+s,'-')
#画第三幅图
x=np.arange(5)
y1,y2,y3=np.random.randint(1,25,size=(3,5))
width=0.25
ax3.bar(x,y1,width)
ax3.bar(x+width,y2,width,color=[u'b',u'g',u'r',u'c',u'm',u'y',u'k'][1])
ax3.bar(x+2*width,y2,width,color=[u'b',u'g',u'r',u'c',u'm',u'y',u'k'][2])
#画第四个图
for i, color in enumerate([u'b',u'g',u'r',u'c',u'm',u'y',u'k']):
xy=np.random.normal(size=2)#随机的坐标轴
ax4.add_patch(plt.Circle(xy,radius=0.3,color=color))
ax4.axis('equal') #把x,y轴调整对称
plt.show()
matplotlib.rcParams参考:https://blog.csdn.net/helunqu2017/article/details/78652261,https://blog.csdn.net/weixin_34378922/article/details/94027767,https://blog.csdn.net/qq_27825451/article/details/81630839。
极坐标有两个维度,1,角度,2,半径。角度和半径形成的坐标体系叫做极坐标。
点1,角度是0,半径是1,点2,角度是90度,半径是2.
举例1
import numpy as np
import matplotlib.pyplot as plt
#生成1到5的半径
r=np.arange(1,6,1)
# 生成角度
theta=[0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
#生成一个图
ax=plt.subplot(111,projection='polar')
# projection='polar',投影未极坐标。
ax.plot(theta,r,color='r',linewidth=3)
ax.grid(True)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
# 生成元素为5的数组array
#r=np.empty(5):array([0. , 0.25, 0.5 , 0.75, 1.])
r=np.empty(5)
r.fill(5)
# 角度
theta=[0,np.pi/2,np.pi,3*np.pi/2,2*np.pi]
ax=plt.subplot(111,projection='polar')
ax.plot(theta,r,color='r',linewidth=3)
ax.grid(True)
plt.show()
举例3
生成8边形,角度要分得更细,共有9个数据点(有一个地方两点重合),
import numpy as np
import matplotlib.pyplot as plt
# 生成9个数据点,那就是个数为9个的array
#r=np.empty(5):array([0. , 0.25, 0.5 , 0.75, 1.])
r=np.empty(9)
r.fill(5)
# 角度
#360度,即2pi平均分成8份,
pi_two=np.pi*2
theta=[0,pi_two/8,2*pi_two/8,3*pi_two/8,4*pi_two/8,
5*pi_two/8,6*pi_two/8,7*pi_two/8,8pi_two/8]
ax=plt.subplot(111,projection='polar')
ax.plot(theta,r,color='r',linewidth=3)
ax.grid(True)
plt.show()
分析如何画图:先画出那条线,之后在里面写好函数
过程
1,图中坐标轴不显示刻度:
如何画,搜一下坐标轴对象,axes有哪些相关方法:
参考网址:参考网址:https://matplotlib.org/api/pyplot_api
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
def func(x):
return -(x-2)*(x-8)+40
x=np.linspace(0,10)
y=func(x)
fig, ax=plt.subplots()
plt.plot(x,y,'r',linewidth=2)
a=2
b=9
ax.set_xticks([a,b])
ax.set_yticks([])
ax.set_xticklabels(['$a$','$b$'])
ix=np.linspace(a,b)
iy=func(ix)
ixy=zip(ix,iy)
verts=[(a,0)]+list(ixy)+[(b,0)] #产生规则的数组
poly=Polygon(verts,facecolor='0.9',edgecolor='0.5') #生成poly对象,数字越大,颜色越浅
ax.add_patch(poly)
plt.figtext(0.9,0.05,'$x$')#x轴标记
plt.figtext(0.1,0.9,'$y$')
#添加函数的数学公式
x_math=(a+b)*0.5
y_math=35
plt.text(x_math,y_math,r'$\int_a^b (-(x-2)*(x-8)+40)dx$',horizontalalignment='center')#按照中间对齐
plt.ylim(ymin=25)#将位置y坐标调小一点
plt.show()
import numpy as np
import matplotlib.pyplot as plt
plt.style.use('ggplot')#决定风格
x=np.random.randn(200)#随机生成200个随机数
y=x+np.random.randn(200)*0.5
#定义变量
margin_border=0.05
width=0.4
margin_between=0.05
height=0.2
#生成三个图的坐标轴
#主图
left_s=margin_border
bottom_s=margin_border
height_s=width
width_s=width
left_x=margin_border
bottom_x=margin_border+width+margin_between
height_x=height
width_x=width
left_y=margin_border+width+margin_between
bottom_y=margin_border
height_y=width
width_y=height
plt.figure(1,figsize=(8,8)) #生成一个8*8的画布
rect_s=[left_s,bottom_s,width_s,height_s]
rect_x=[left_x,bottom_x,width_x,height_x]
rect_y=[left_y,bottom_y,width_y,height_y]
axScatter=plt.axes(rect_s)
axHisX=plt.axes(rect_x)
axHisY=plt.axes(rect_y)
#去掉图一的x轴标注和图三的y轴标注
axHisX.set_xticks([])
axHisY.set_yticks([])
#画散点图
axScatter.scatter(x,y)
bin_width=0.25
xymax=np.max([np.max(np.fabs(x)),np.max(np.fabs(y))])
lim=int(xymax/bin_width+1)*bin_width#得到图形精确宽度值
axScatter.set_xlim(-lim,lim)#对图形的x轴和y轴进行限制
axScatter.set_ylim(-lim,lim)
#画条形图
bins=np.arange(-lim,lim+bin_width,bin_width)#以bin_width为步长
axHisX.hist(x,bins=bins)
axHisY.hist(y,bins=bins,orientation='horizontal')
#设置柱形图的坐标范围
axHisX.set_xlim(axScatter.get_xlim())
axHisY.set_ylim(axScatter.get_ylim() )
plt.show()
#_*_ coding:utf-8 _*_
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties #显示的定义所要使用的字体 _
plt.style.use('ggplot')
font=FontProperties(fname=r'c:\windows\fonts\simsun.ttc',size=12)
ability_size=6
ability_label=['进攻','防守','盘带','速度','体力','射术']
ax1=plt.subplot(221,projection='polar') #生成2行2列的第一个极坐标子图
ax2=plt.subplot(222,projection='polar')
ax3=plt.subplot(223,projection='polar')
ax4=plt.subplot(224,projection='polar')
#随机生成学员的能力值
player={
'M':np.random.randint(size=ability_size,low=60,high=99),
'H':np.random.randint(size=ability_size,low=60,high=99),
'P':np.random.randint(size=ability_size,low=60,high=99),
'Q':np.random.randint(size=ability_size,low=60,high=99),
}
theta=np.linspace(0,2*np.pi,6,endpoint=False)#生成极坐标的角度
theta=np.append(theta,theta[0])#使首尾拼接
player['M']=np.append(player['M'],player['M'][0]) #使M产生的数值形成首尾相接闭环的效果
ax1.plot(theta,player['M'],'r')#绘制首尾相接的图
ax1.fill(theta,player['M'],'r',alpha=0.3) #用红色填充
ax1.set_xticks(theta)#定义成6等分的ticks
ax1.set_xticklabels(ability_label,y=0.1,fontproperties=font)
ax1.set_title(u'梅西',fontproperties=font,color='r',size=20)
player['H']=np.append(player['H'],player['H'][0]) #使M产生的数值形成首尾相接闭环的效果
ax2.plot(theta,player['H'],'g')#绘制首尾相接的图
ax2.fill(theta,player['H'],'g',alpha=0.3) #用红色填充
ax2.set_xticks(theta)#定义成6等分的ticks
ax2.set_xticklabels(ability_label,y=0.1,fontproperties=font)
ax2.set_title(u'哈维',fontproperties=font,color='g',size=20)
player['P']=np.append(player['P'],player['P'][0]) #使M产生的数值形成首尾相接闭环的效果
ax3.plot(theta,player['P'],'b')#绘制首尾相接的图
ax3.fill(theta,player['P'],'b',alpha=0.3) #用红色填充
ax3.set_xticks(theta)#定义成6等分的ticks
ax3.set_xticklabels(ability_label,y=0.1,fontproperties=font)
ax3.set_title(u'皮克',fontproperties=font,color='b',size=20)
player['Q']=np.append(player['Q'],player['Q'][0]) #使M产生的数值形成首尾相接闭环的效果
ax4.plot(theta,player['Q'],'y')#绘制首尾相接的图
ax4.fill(theta,player['Q'],'y',alpha=0.3) #用红色填充
ax4.set_xticks(theta)#定义成6等分的ticks
ax4.set_xticklabels(ability_label,y=0.1,fontproperties=font)
ax4.set_title(u'切赫',fontproperties=font,color='y',size=20)
plt.show()
参考:https://blog.csdn.net/qq_41511262/article/details/102966270