几个练习
1.函数积分图
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
def func(x):
return -(x-2)*(x-8) + 40
# linspace:这块的几个一直没搞太清楚,需要总体学一下
x = np.linspace(0,10)
y = func(x)
fig,ax = plt.subplots()
plt.plot(x,y,'r',linewidth = 2)
# 把坐标轴的数值变没,画上ab
a,b = 2,9
ax.set_xticks([a,b])
ax.set_yticks([])
ax.set_xticklabels([r'$a$',r'$b$'])
# 在恰当的位置画上xy
plt.figtext(0.9,0.07,'$x$')
plt.figtext(0.1,0.9,'$y$')
# 画积分的区域
ix = np.linspace(a,b)
iy = func(ix)
ixy = zip(ix,iy)
verts = [(a,0)]+list(ixy)+[(b,0)]
poly = Polygon(verts,facecolor = '0.8',edgecolor = '0.2')
ax.add_patch(poly)
# 文字的添加
x_math,y_math = (a+b)*0.5,20
ax.text(x_math,y_math,r'$\int_a^b(-(x-2)*(x-8) + 40)dx$',fontsize=13,horizontalalignment='center')
#最后升高一下
plt.ylim(bottom=0)
plt.show()
2.散点条形图
# 散点-条形图
import numpy as np
import matplotlib.pyplot as plt
# 图形为了美观直接使用'ggplot'风格
# plt.style.use('ggplot')
# 从标准正态分布中返回多个样本值
x = np.random.randn(200)
y = x + np.random.randn(200)*0.5
margin_border = 0.1
width = 0.6
margin_between = 0.02
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))
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)
# 去掉重复坐标轴
axHisX.set_xticks([])
axHisY.set_yticks([])
# 画散点图,x,y默认为20,y正负控制相关性
axScatter.scatter(x,y,color='b')
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)
axScatter.set_ylim(-lim,lim)
# 画直方图
bins = np.arange(-lim,lim+bin_width,bin_width)
axHisX.hist(x,bins = bins,width =0.18)
axHisY.hist(y,bins = bins,height =0.18,orientation='horizontal')
# 调整两个子图的坐标轴刻度
axHisX.set_xlim(axScatter.get_xlim())
axHisY.set_ylim(axScatter.get_ylim())
# 添加标题
plt.title('Scatter and Hist',y=-0.15,x=-1.2)
plt.show()
3.球员能力图:
# 球员能力图
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=10)
# 能力标签
ability_size = 6
ability_label = ['进攻','防守','盘带','速度','体力','射术']
# 生成4个子图
ax1 = plt.subplot(221,projection='polar')
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),
}
# 角度值,首尾相接共7个
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])
# 画图
ax1.plot(theta,player['M'],'r')
# 填充颜色
ax1.fill(theta,player['M'],'r',alpha=0.3)
# 重新生成极坐标 与能力对应
ax1.set_xticks(theta)
# 设置标签,此时,字体并没有正确的显示出来,matplotlib不知道用什么字体读取,需要显式的设置
ax1.set_xticklabels(ability_label,y=0.05,fontproperties=font)
# 添加标签
ax1.set_title('梅西',fontproperties=font,color='r',size=15)
player['H'] = np.append(player['H'],player['H'][0])
ax2.plot(theta,player['H'],'b')
ax2.fill(theta,player['H'],'b',alpha=0.3)
ax2.set_xticks(theta)
ax2.set_xticklabels(ability_label,y=0.05,fontproperties=font)
ax2.set_title('哈维',fontproperties=font,color='b',size=15)
player['P'] = np.append(player['P'],player['P'][0])
ax3.plot(theta,player['P'],'g')
ax3.fill(theta,player['P'],'g',alpha=0.3)
ax3.set_xticks(theta)
ax3.set_xticklabels(ability_label,y=0.05,fontproperties=font)
ax3.set_title('皮克',fontproperties=font,color='g',size=15)
player['Q'] = np.append(player['Q'],player['Q'][0])
ax4.plot(theta,player['Q'],'y')
ax4.fill(theta,player['Q'],'y',alpha=0.3)
ax4.set_xticks(theta)
ax4.set_xticklabels(ability_label,y=0.05,fontproperties=font)
ax4.set_title('切赫',fontproperties=font,color='y',size=15)
plt.show()
4.股票K线图:
# 导入需要的库
import tushare as ts
import matplotlib.pyplot as plt
import matplotlib.finance as mpf
%matplotlib inline
# 设置历史数据区间
date1 = (2014, 12, 1) # 起始日期,格式:(年,月,日)元组
date2 = (2016, 12, 1) # 结束日期,格式:(年,月,日)元组
# 从雅虎财经中获取股票代码601558的历史行情
quotes = mpf.quotes_historical_yahoo_ohlc('601558.ss', date1, date2)
# 创建一个子图
fig, ax = plt.subplots(facecolor=(0.5, 0.5, 0.5))
fig.subplots_adjust(bottom=0.2)
# 设置X轴刻度为日期时间
ax.xaxis_date()
# X轴刻度文字倾斜45度
plt.xticks(rotation=45)
plt.title("股票代码:601558两年K线图")
plt.xlabel("时间")
plt.ylabel("股价(元)")
mpf.candlestick_ohlc(ax,quotes,width=1.2,colorup='r',colordown='green')
plt.grid(True)
import os
import pandas as pd
import matplotlib.pyplot as plt
import mpl_finance as mpf
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
# 设置总体样式
plt.style.use("ggplot")
# 数据来源
data = pd.read_csv(r'000001.csv', index_col='Date', parse_dates=True)
# 单独取出volume数据绘图使用
vol = data['Volume']
# 设置两个图的位置
left, width = 0.1, 0.8
rect_vol = [left, 0.1, width, 0.3]
rect_main = [left, 0.46, width, 0.5]
# 创建画布
fig = plt.figure()
# 添加两个坐标轴
ax_vol = fig.add_axes(rect_vol)
ax_main = fig.add_axes(rect_main)
# 填充volume图
ax_vol.fill_between(vol.index, vol.values, color='y')
# 设置x轴显示样式
plt.setp(ax_vol.get_xticklabels(), rotation=30, horizontalalignment='right')
# 替换timestamp to float
main_data = []
for d in data.reset_index().values:
d[0] = d[0].timestamp()
main_data.append((d[0], d[1], d[2], d[3], d[4]))
print(main_data)
# 绘制蜡烛图
mpf.candlestick_ohlc(ax_main, main_data, width=30000, colorup='r', colordown='g')
plt.xticks([])
plt.show()