函数:y = -(x-2)*(x-8)+40
# object-oriented面向对象方式
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import numpy as np
def func(x):
return -(x-2)*(x-8)+40
x = np.linspace(0,10)
y = func(x)
fig = plt.figure()
ax = fig.add_subplot(111)
# 设置x轴标记点和名称
ax.set_xticks([2,9])
ax.set_xticklabels(['a=2','b=9'])
# 设置x轴和y轴标签,参数分别为占x轴比例、占y轴比例,标签
plt.figtext(0.9,0.07,'$x$')
plt.figtext(0.12,0.9,'$y$')
# 用多边形ploygon的方法画出积分面积,a=2,b=9
# 找出多边形一周的顶点
verts = [(2,0)] + list(zip(np.linspace(2,9),func(np.linspace(2,9))))+[(9,0)]
polygon = mpatches.Polygon(verts,facecolor='0.9',edgecolor='0.5')
ax.plot(x,y,'r',linewidth=2)
ax.add_patch(polygon)
ax.text(2.5,30,r'$ \int_a^b(-(x-2)*(x-8)+40) dx $',fontsize=13)
plt.show()
对于不同大小的子图,不能使用figure.add_subplot(),应该使用figure.add_axes([left,bottom,width,height])
# object-oriented面向对象方式
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('ggplot')
# 设置边界、间隔、高、宽所占figure的比例
border = 0.1
between = 0.05
height = 0.2
width = 0.6
# 生成数据
x = np.random.normal(loc=0,scale=1.5,size=200)
y = -x + np.random.normal(loc=0,scale=1.5,size=200)*0.3
# 设置三个图形的参数,列表表示,左下点的x、y坐标、高度、宽度
left_1 = border
bottom_1 = border
width_1 = width
height_1 = width
left_2 = border
bottom_2 = border + width + between
width_2 = width
height_2 = height
left_3 = border + width + between
bottom_3 = border
width_3 = height
height_3 = width
# 创建figure和三个矩形图的参数列表
fig = plt.figure(1,figsize=(6,6))
rect_1 = [left_1,bottom_1,width_1,height_1]
rect_2 = [left_2,bottom_2,width_2,height_2]
rect_3 = [left_3,bottom_3,width_3,height_3]
# 创建三个图形
axScatter = fig.add_axes(rect_1)
axHistx = fig.add_axes(rect_2)
axHisty = fig.add_axes(rect_3)
# 清除不必要的坐标轴坐标
axHistx.set_xticks([])
axHisty.set_yticks([])
# 绘制三个图
axScatter.scatter(x,y,color='c',s=5,alpha=0.8)
axHistx.hist(x,bins=20,normed=True,color='b')
axHisty.hist(y,bins=20,orientation='horizontal',normed=True,color='c')
# 把两个直方图的坐标与散点图对齐
axHistx.set_xlim(axScatter.get_xlim())
axHisty.set_ylim(axScatter.get_ylim())
plt.show()
球员能力为随机数生成,不具备实际参考价值。
步骤:
1.导入numpy和matplotlib.pyplot模块,中文字体需要导入字体模块FontProperties;
2.设置六个能力标签,并随机生成四名球员的能力数值;
3.创建四个极坐标子图,并依次作图和填充颜色、更改坐标轴刻度及标签。
# -*- coding:utf-8 _*-
import matplotlib.pyplot as plt
import numpy as np
# 导入字体库
from matplotlib.font_manager import FontProperties
plt.style.use('ggplot')
# 能力标签设置
ability_label = [u'进攻',u'防守',u'盘带',u'速度',u'体力',u'射门']
ability_size = len(ability_label)
# 球员具体能力设置,并在最后添加一项与第一项相同,以保证闭合图形
player = {
'M':np.random.randint(low=60,high=99,size=ability_size),
'H':np.random.randint(low=60,high=99,size=ability_size),
'P':np.random.randint(low=60,high=99,size=ability_size),
'Q':np.random.randint(low=60,high=99,size=ability_size)
}
for key,array in player.items():
player[key] = np.append(array,array[0])
# 设置四个子图
ax1 = plt.subplot(221,projection='polar')
ax2 = plt.subplot(222,projection='polar')
ax3 = plt.subplot(223,projection='polar')
ax4 = plt.subplot(224,projection='polar')
# 依次进行作图
theta = np.linspace(0,2*np.pi,7)
ax1.plot(theta,player['M'],color='r')
ax1.fill(theta,player['M'],facecolor='r',alpha=0.3)
ax2.plot(theta,player['H'],color='g')
ax2.fill(theta,player['H'],facecolor='g',alpha=0.3)
ax3.plot(theta,player['P'],color='b')
ax3.fill(theta,player['P'],facecolor='b',alpha=0.3)
ax4.plot(theta,player['Q'],color='y')
ax4.fill(theta,player['Q'],facecolor='y',alpha=0.3)
# 设定图形中的标签字体
font = FontProperties(fname=r'c:\Windows\Fonts\msyh.ttc',size=12)
#修改极坐标轴刻度、标签,并设置子图标题
ax1.set_xticks(theta[:-1])
ax1.set_xticklabels(labels=ability_label,fontproperties=font)
ax1.set_title(label=u'梅西',position=(0.5,0.97),fontproperties=font,size=12,color='r')
ax2.set_xticks(theta[:-1])
ax2.set_xticklabels(labels=ability_label,fontproperties=font)
ax2.set_title(label=u'哈维',position=(0.5,0.97),fontproperties=font,size=12,color='g')
ax3.set_xticks(theta[:-1])
ax3.set_xticklabels(labels=ability_label,fontproperties=font)
ax3.set_title(label=u'皮克',position=(0.5,0.97),fontproperties=font,size=12,color='b')
ax4.set_xticks(theta[:-1])
ax4.set_xticklabels(labels=ability_label,fontproperties=font)
ax4.set_title(label=u'切赫',position=(0.5,0.97),fontproperties=font,size=12,color='y')
plt.show()
1.mplfinance是python中可以用来画出蜡烛图、线图的分析工具,目前已经从matplotlib中独立出来,需要下载并更新,在anaconda或者python(取决于自己使用的解释器)命令行中输入:
pip install https://github.com/matplotlib/mpl_finance/archive/master.zip
安装完毕后进行更新:
pip install --upgrade mplfinance
之后导入mplfinance模块即可----import mplfinance
2.步骤:
1)导入matplotlib相应模块、时间模块和股票数据获取模块;
2)获得股票数据----pandas_datareader.data.DataReader(股票,网址,开始时间,结束时间);
3)用面向对象的方法创建两个子图;
4)用折线图和填充的方式绘制成交量volume的图;
5)用mpl_finance.candlestick2_ohlc(子图,o,h,l,c)绘制股票K型线图。
注意:
1.股票k线图中,红色表示当日上涨,绿色表示当日下降:
2.本次股票k线图使用的是mpl_finance中的candlestick2_ohlc函数,现在更推荐将mpl_finance更新为mplfinance模块,用于股票k线图。
# -*- coding:utf-8 _*-
import matplotlib.pyplot as plt
import mpl_finance as mpf
from datetime import datetime
plt.style.use('ggplot')
# 导入股票数据获取模块
import pandas_datareader.data as web
#从雅虎财经读取谷歌google(股票代码:GOOG )
start = datetime(2019,7,1)
end = datetime.today()
google = web.DataReader('GOOG', 'yahoo',start,end)
# 创建两个子图
fig = plt.figure()
left,width = 0.13,0.8
rect_down = [left,0.1,width,0.27]
rect_up = [left,0.4,width,0.5]
ax_down = fig.add_axes(rect_down)
ax_up = fig.add_axes(rect_up)
# 下子图成交量的绘制,用填充的方法
dates = google.index
volume = google['Volume']
ax_down.plot(volume,color='r',alpha=0.5)
ax_down.fill_between(dates,volume,color='y',alpha=0.7)
# 下子图横坐标日期格式的转换和倾斜字设置
ax_down.xaxis_date()
plt.setp(ax_down.get_xticklabels(),rotation=30,horizontalalignment='right')
# 上子图绘制
mpf.candlestick2_ohlc(ax_up,google['Open'],google['High'],google['Low'],google['Close'],
width=0.5,colorup='r',colordown='g')
# 上子图横坐标去除
ax_up.set_xticklabels([])
# 设置标题
ax_up.set_title('Google Price and Volume')
plt.show()
1.如果子图大小均相等:
1)可以先创建figure----fig = plt.figure();
在figure中添加子图----ax1 = fig.add_subplot(221,projection=‘polar’),见函数积分图;
2)直接在plt中创建子图----plt.subplot(221),见球员能力图;
2.如果子图大小不相等:
先创建figure----fig = plt.figure();
再设置每个子图的参数rect_1 = [left_1,bottom_1,width_1,height_1],分别包括左下角的坐标+宽度+高度;
然后再添加子图----ax1 = fig.add_axes(rect_1),见散点-条形图。
quote----引用
corporation----公司
deprecated----不推荐使用
rotation----回转,逆时针转
alignment----对准
horitontalalignment----水平对准
volume----体积,量,股票成交量
1.标题title指一张图的标题:
1)面向对象的方式,在子图ax中添加标题:ax.set_title('title')
2)直接用plt作图的方式,在图中添加标题:plt.title('title')
2.文字text指插入一段文字:必须指明位置x、y和字符串s
1)面向对象的方式,在子图ax中添加文字:ax.text(x=x,y=y,s='title')
2)直接用plt作图的方式,在图中添加文字:plt.text(x=x,y=y,s='title')