今天開始琢磨用Python畫圖,沒使用之前是一臉懵的,我使用的開發(fā)環(huán)境是Pycharm,這個(gè)輸出的是一行行命令,這個(gè)圖畫在哪里呢?
創(chuàng)新互聯(lián)公司是一家專業(yè)從事網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷、成都微信小程序、網(wǎng)站運(yùn)營(yíng)為一體的建站企業(yè);在網(wǎng)站建設(shè)告別千篇一律,告別似曾相識(shí),這一次我們重新定義網(wǎng)站建設(shè),讓您的網(wǎng)站別具一格。響應(yīng)式網(wǎng)站建設(shè),實(shí)現(xiàn)全網(wǎng)營(yíng)銷!一站適應(yīng)多終端,一樣的建站,不一樣的體驗(yàn)!
搜索之后發(fā)現(xiàn),它會(huì)彈出一個(gè)對(duì)話框,然后就開始畫了,比如下圖
第一個(gè)常用的庫(kù)是Turtle,它是Python語(yǔ)言中一個(gè)很流行的繪制圖像的函數(shù)庫(kù),這個(gè)詞的意思就是烏龜,你可以想象下一個(gè)小烏龜在一個(gè)x和y軸的平面坐標(biāo)系里,從原點(diǎn)開始根據(jù)指令控制,爬行出來就是繪制的圖形了。
它最常用的指令就是旋轉(zhuǎn)和移動(dòng),比如畫個(gè)圓,就是繞著圓心移動(dòng);再比如上圖這個(gè)怎么畫呢,其實(shí)主要就兩個(gè)命令:
turtle.forward(200)
turtle.left(170)
第一個(gè)命令是移動(dòng)200個(gè)單位并畫出來軌跡
第二個(gè)命令是畫筆順時(shí)針轉(zhuǎn)170度,注意此時(shí)并沒有移動(dòng),只是轉(zhuǎn)角度
然后呢? 循環(huán)重復(fù)就畫出來這個(gè)圖了
好玩吧。
有需要仔細(xì)研究的可以看下這篇文章 ,這個(gè)牛人最后用這個(gè)庫(kù)畫個(gè)移動(dòng)的鐘表,太贊了。
Turtle雖好玩,但是我想要的是我給定數(shù)據(jù),然后讓它畫圖,這里就找到另一個(gè)常用的畫圖的庫(kù)了。
Matplotlib是python最著名的繪圖庫(kù),它提供了一整套和matlab相似的命令A(yù)PI,十分適合交互式地行制圖。其中,matplotlib的pyplot模塊一般是最常用的,可以方便用戶快速繪制二維圖表。
使用起來也挺簡(jiǎn)單,
首先import matplotlib.pyplot as plt?導(dǎo)入畫圖的圖。
然后給定x和y,用這個(gè)命令plt.plot(x, y)就能畫圖了,接著用plt.show()就可以把圖形展示出來。
接著就是各種完善,比如加標(biāo)題,設(shè)定x軸和y軸標(biāo)簽,范圍,顏色,網(wǎng)格等等,在 這篇文章里介紹的很詳細(xì)。
現(xiàn)在互聯(lián)網(wǎng)的好處就是你需要什么內(nèi)容,基本上都能搜索出來,而且還是免費(fèi)的。
我為什么要研究這個(gè)呢?當(dāng)然是為了用,比如我把比特幣的曲線自己畫出來可好?
假設(shè)現(xiàn)在有個(gè)數(shù)據(jù)csv文件,一列是日期,另一列是比特幣的價(jià)格,那用這個(gè)命令畫下:
這兩列數(shù)據(jù)讀到pandas中,日期為df['time']列,比特幣價(jià)格為df['ini'],那我只要使用如下命令
plt.plot(df['time'], df['ini'])
plt.show()
就能得到如下圖:
自己畫的是不是很香,哈哈!
然后呢,我在上篇文章 中介紹過求Ahr999指數(shù),那可不可以也放到這張圖中呢?不就是加一條命令嘛
plt.plot(df['time'], df['Ahr999'])
圖形如下:
但是,Ahr999指數(shù)怎么就一條線不動(dòng)啊,?原來兩個(gè)Y軸不一致,顯示出來太怪了,需要用多Y軸,問題來了。
繼續(xù)谷歌一下,把第二個(gè)Y軸放右邊就行了,不過呢得使用多圖,重新繪制
fig = plt.figure() # 多圖
ax1 = fig.add_subplot(111)
ax1.plot(df['time'], df['ini'], label="BTC price")? #?繪制第一個(gè)圖比特幣價(jià)格
ax1.set_ylabel('BTC price') #?加上標(biāo)簽
# 第二個(gè)直接對(duì)稱就行了
ax2 = ax1.twinx()#?在右邊增加一個(gè)Y軸
ax2.plot(df['time'], df['Ahr999'], 'r', label="ahr999")??#?繪制第二個(gè)圖Ahr999指數(shù),紅色
ax2.set_ylim([0, 50])# 設(shè)定第二個(gè)Y軸范圍
ax2.set_ylabel('ahr999')
plt.grid(color="k", linestyle=":")# 網(wǎng)格
fig.legend(loc="center")#圖例
plt.show()
跑起來看看效果,雖然丑了點(diǎn),但終于跑通了。
這樣就可以把所有指數(shù)都繪制到一張圖中,等等,三個(gè)甚至多個(gè)Y軸怎么加?這又是一個(gè)問題,留給愛思考愛學(xué)習(xí)的你。
有了自己的數(shù)據(jù),建立自己的各個(gè)指數(shù),然后再放到圖形界面中,同時(shí)針對(duì)異常情況再自動(dòng)進(jìn)行提醒,比如要抄底了,要賣出了,用程序做出自己的晴雨表。
pre
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)
plt.ylim(ymin=20)
a=2
b=9
ax.set_xticks([a,b])
ax.set_xticklabels(['$a$','$b$'])
ax.set_yticks([])
plt.figtext(0.9,0.05,'$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.9',edgecolor='0.5')
ax.add_patch(poly)
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',size=12)
plt.show()
/pre
matplotlib.pyplot.imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, *, filternorm=True, filterrad=4.0, resample=None, url=None, data=None, **kwargs)
From:
改以下參數(shù)可以對(duì)圖片效果進(jìn)行調(diào)整:
舉個(gè)栗子:
clear?
close?all
%%%%%%%%%%%%%%%%%%%%%%%%%生成實(shí)驗(yàn)數(shù)據(jù)集
rand('state',0)
sigma_matrix1=eye(2);
sigma_matrix2=50*eye(2);
u1=[0,0];
u2=[30,30];
m1=100;
m2=300;%樣本數(shù)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm1數(shù)據(jù)集
Y1=multivrandn(u1,m1,sigma_matrix1);
Y2=multivrandn(u2,m2,sigma_matrix2);
scatter(Y1(:,1),Y1(:,2),'bo')
hold?on
scatter(Y2(:,1),Y2(:,2),'r*')
title('SM1數(shù)據(jù)集')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sm2數(shù)據(jù)集
u11=[0,0];
u22=[5,5];
u33=[10,10];
u44=[15,15];
m=600;
sigma_matrix3=2*eye(2);
Y11=multivrandn(u11,m,sigma_matrix3);
Y22=multivrandn(u22,m,sigma_matrix3);
Y33=multivrandn(u33,m,sigma_matrix3);
Y44=multivrandn(u44,m,sigma_matrix3);
figure(2)
scatter(Y11(:,1),Y11(:,2),'bo')
hold?on
scatter(Y22(:,1),Y22(:,2),'r*')
scatter(Y33(:,1),Y33(:,2),'go')
scatter(Y44(:,1),Y44(:,2),'c*')
title('SM2數(shù)據(jù)集')
end
function?Y?=?multivrandn(u,m,sigma_matrix)
%%生成指定均值和協(xié)方差矩陣的高斯數(shù)據(jù)
n=length(u);
c?=?chol(sigma_matrix);
X=randn(m,n);
Y=X*c+ones(m,1)*u;
end