>>> import pandas as pd
>>> import os
>>> os.chdir("D:\\")
>>> d = pd.read_csv("GWAS_water.qassoc", delimiter= "\s+")
>>> d.loc[1:3]
CHR SNP BP NMISS BETA SE R2 T P
1 1 . 447 44 0.1800 0.1783 0.02369 1.009 0.3185
2 1 . 449 44 0.2785 0.2473 0.02931 1.126 0.2665
3 1 . 452 44 0.1800 0.1783 0.02369 1.009 0.3185
>>> d.loc[0:3]
CHR SNP BP NMISS BETA SE R2 T P
0 1 . 410 44 0.2157 0.1772 0.03406 1.217 0.2304
1 1 . 447 44 0.1800 0.1783 0.02369 1.009 0.3185
2 1 . 449 44 0.2785 0.2473 0.02931 1.126 0.2665
3 1 . 452 44 0.1800 0.1783 0.02369 1.009 0.3185
>>> d.iloc[0:3]
CHR SNP BP NMISS BETA SE R2 T P
0 1 . 410 44 0.2157 0.1772 0.03406 1.217 0.2304
1 1 . 447 44 0.1800 0.1783 0.02369 1.009 0.3185
2 1 . 449 44 0.2785 0.2473 0.02931 1.126 0.2665
>>> d.iloc[1:3,2]
1 447
2 449
Name: BP, dtype: int64
>>> d.iloc[0:3,2]
0 410
1 447
2 449
Name: BP, dtype: int64
>>> d.head()
CHR SNP BP NMISS BETA SE R2 T P
0 1 . 410 44 0.2157 0.1772 0.03406 1.2170 0.2304
1 1 . 447 44 0.1800 0.1783 0.02369 1.0090 0.3185
2 1 . 449 44 0.2785 0.2473 0.02931 1.1260 0.2665
3 1 . 452 44 0.1800 0.1783 0.02369 1.0090 0.3185
4 1 . 462 44 0.2548 0.2744 0.02012 0.9286 0.3584
>>> d.tail(3)
CHR SNP BP NMISS BETA SE R2 T P
418704 12 . 19345588 44 -0.2207 0.2558 0.01743 -0.8631 0.393
418705 12 . 19345598 44 -0.2207 0.2558 0.01743 -0.8631 0.393
418706 12 . 19345611 44 -0.2207 0.2558 0.01743 -0.8631 0.393
>>> d.describe()
CHR BP NMISS BETA SE \
count 418707.000000 4.187070e+05 418707.0 4.186820e+05 418682.00000
mean 5.805738 1.442822e+07 44.0 -4.271777e-03 0.21433
std 3.392930 8.933882e+06 0.0 2.330019e-01 0.05190
min 1.000000 4.100000e+02 44.0 -1.610000e+00 0.10130
25% 3.000000 7.345860e+06 44.0 -1.638000e-01 0.17320
50% 5.000000 1.371612e+07 44.0 -1.826000e-16 0.20670
75% 9.000000 2.051322e+07 44.0 1.391000e-01 0.25010
max 12.000000 4.238896e+07 44.0 1.467000e+00 0.67580
R2 T P
count 418682.000000 4.186820e+05 4.186820e+05
mean 0.026268 -1.910774e-02 4.772397e-01
std 0.035903 1.095115e+00 2.944290e-01
min 0.000000 -5.582000e+00 2.034000e-08
25% 0.002969 -7.955000e-01 2.179000e-01
50% 0.012930 -8.468000e-16 4.624000e-01
75% 0.035910 6.712000e-01 7.254000e-01
max 0.531200 6.898000e+00 1.000000e+00
>>> d.sort_values(by="P").iloc[0:15]
CHR SNP BP NMISS BETA SE R2 T P
42870 1 . 32316680 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
29301 1 . 22184568 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
29302 1 . 22184590 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
29306 1 . 22184654 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
29305 1 . 22184628 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
29304 1 . 22184624 44 1.1870 0.1721 0.5312 6.898 2.034000e-08
112212 3 . 14365699 44 1.4670 0.2255 0.5018 6.504 7.490000e-08
29254 1 . 22167448 44 1.0780 0.1723 0.4822 6.254 1.713000e-07
69291 2 . 9480651 44 1.1140 0.1829 0.4690 6.091 2.939000e-07
29299 1 . 22180991 44 0.8527 0.1458 0.4488 5.848 6.574000e-07
101391 3 . 6959715 44 0.6782 0.1166 0.4462 5.817 7.285000e-07
29333 1 . 22198267 44 0.9252 0.1616 0.4383 5.724 9.888000e-07
195513 5 . 20178388 44 1.0350 0.1817 0.4359 5.697 1.082000e-06
29295 1 . 22180901 44 0.7469 0.1320 0.4324 5.657 1.236000e-06
29300 1 . 22181119 44 0.7469 0.1320 0.4324 5.657 1.236000e-06
>>> sort_D = d.sort_values(by="P").iloc[0:5]
>>> m_D = d.dropna() #remove NA
>>> sort_C = d.sort_values(["P","CHR", "BP"])
>>> sort_C.to_csv(file_name, sep='\t', encoding='utf-8')
>>> d.sort_values(by="C", ascending=True)
>>> sort_D.to_csv("result.txt", sep= " ")
>>> sort_D.to_csv("result_no_index.txt", sep= " ", index=False)
>>>
參考
for m, i in enumerate(list(range(1,10))):
for n, j in enumerate(list(range(m+1,10))):
print i * j
安裝:
pip install pandas
導(dǎo)入:
import pandas as pd
from pandas import Series,DataFrame
#Series
數(shù)據(jù)類型: Series,DataFrame
Series:與numpy中的一維數(shù)組相似
初始化:
方式一:
data = [1,2,3,4,5] #一般為序列
series_data = Series(data) #不傳入任何參數(shù),索引默認(rèn)從0開(kāi)始
方式二:
indexes = ['name','shuxue','yuwen','huaxue','yingyu']
series_data =Series(['lizhen',1,2,3,4],index=indexes) #索引為指定的索引值,此時(shí)索引為指定的值,索引的長(zhǎng)度與值的長(zhǎng)度一定要相等
方式三:
data = {'huaxue': 3, 'name': 'lizhen', 'shuxue': 1, 'yingyu': 4, 'yuwen': 2}
series_from_dict = Series(data)
查看索引:series_data.index
根據(jù)索引修改值: series_data.'shuxue' = 3
查看全部數(shù)據(jù):series_data.values
設(shè)置數(shù)據(jù)名稱: series_data.index.name = 'type'
根據(jù)索引查找列的值: series_data['yuwen']
獲取多個(gè)索引的值: series_data[['yingyu','yuwen']]
導(dǎo)出數(shù)據(jù)到指定格式(dict,clipboard,csv,json,string,sql):
series_from_dict.to_dict()
兩個(gè)Series相加:
具有相同的索引才可以相加, 當(dāng)索引不同時(shí),相加的結(jié)果為 NaN
只有值為整數(shù)時(shí)才有意義
判斷索引是否存在:
index_name in series_data #返回True 或者 False
#DataFrame類似表或電子表格
初始化時(shí)傳入等長(zhǎng)列表或numpy數(shù)組組成的字典,自動(dòng)增加索引,且全部列都會(huì)被有序排列
方式一:
data = {'state': ['Ohio','Ohio','Ohio'],
'year': [2000,2001,2002],
'pop': [1.5,1.7,3.6]
}
frame = DataFrame(data) #
方式二:
data = {'state': ['Ohio','Ohio','Ohio'],
'year': [2000,2001,2002],
'pop': [1.5,1.7,3.6]
}
frame = DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three'])
#數(shù)據(jù)展示按照column指定的格式
#若傳入的列未找到,默認(rèn)為NaN
方式三:
data = {'Nevada': {2001:2.4,2002:2.9},
'Ohio':{2000:1.5,2001s:1.7,2002:2.4},
}
frame = DataFrame(data)
#外層key解釋為column name, 內(nèi)層key解釋為 index name, 內(nèi)層key不存在時(shí),對(duì)應(yīng)的column默認(rèn)NaN補(bǔ)齊
設(shè)置索引的名稱: frame.idnex.name = 'self_index_name'
設(shè)置列的名稱: frame.columns.name = 'self_columns_name'
查看所有的值: frame.values
查看所有的列名: frame.columns
查看指定列的值:frame[column_name] 或 frame.column_name
查看前N行的值: frame.head(n)
查看后N行值: frame.tail(n)
查看指定索引行的值: frame.ix[[index_name1[,index_name2]]]
修改指定列的值: frame['column_name'] = 'new_value'
注意:當(dāng)指定的值為單一值時(shí), 會(huì)自動(dòng)在所有的行上廣播
指定多個(gè)值時(shí), 長(zhǎng)度需要和frame的行的長(zhǎng)度相等
指定的值可以為Series, Series的索引必須與frame的索引名稱相同,索引名不同時(shí),默認(rèn)插入NaN
刪除不需要的列: del frame['column_name']
注意: 索引的名稱無(wú)法更改
在使用pandas框架的DataFrame的過(guò)程中,如果需要處理一些字符串的特性,例如判斷某列是否包含一些關(guān)鍵字,某列的字符長(zhǎng)度是否小于3等等這種需求,如果掌握str列內(nèi)置的方法,處理起來(lái)會(huì)方便很多。
下面我們來(lái)詳細(xì)了解一下,Series類的str自帶的方法有哪些。
1、cat() 拼接字符串
例子:
>>> Series(['a', 'b', 'c']).str.cat(['A', 'B', 'C'], sep=',')
0 a,A
1 b,B
2 c,C
dtype: object
>>> Series(['a', 'b', 'c']).str.cat(sep=',')
'a,b,c'
>>> Series(['a', 'b']).str.cat([['x', 'y'], ['1', '2']], sep=',')
0 a,x,1
1 b,y,2
dtype: object
2、split() 切分字符串
>>> import numpy,pandas;
>>> s = pandas.Series(['a_b_c', 'c_d_e', numpy.nan, 'f_g_h'])
>>> s.str.split('_')
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
>>> s.str.split('_', -1)
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
>>> s.str.split('_', 0)
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
>>> s.str.split('_', 1)
0 [a, b_c]
1 [c, d_e]
2 NaN
3 [f, g_h]
dtype: object
>>> s.str.split('_', 2)
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
>>> s.str.split('_', 3)
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
3、get() 獲取指定位置的字符串
>>> s.str.get(0)
0 a
1 c
2 NaN
3 f
dtype: object
>>> s.str.get(1)
0 _
1 _
2 NaN
3 _
dtype: object
>>> s.str.get(2)
0 b
1 d
2 NaN
3 g
dtype: object
4、join() 對(duì)每個(gè)字符都用給點(diǎn)的字符串拼接起來(lái),不常用
>>> s.str.join("!")
0 a!_!b!_!c
1 c!_!d!_!e
2 NaN
3 f!_!g!_!h
dtype: object
>>> s.str.join("?")
0 a?_?b?_?c
1 c?_?d?_?e
2 NaN
3 f?_?g?_?h
dtype: object
>>> s.str.join(".")
0 a._.b._.c
1 c._.d._.e
2 NaN
3 f._.g._.h
dtype: object
5、contains() 是否包含表達(dá)式
>>> s.str.contains('d')
0 False
1 True
2 NaN
3 False
dtype: object
6、replace() 替換
>>> s.str.replace("_", ".")
0 a.b.c
1 c.d.e
2 NaN
3 f.g.h
dtype: object
7、repeat() 重復(fù)
>>> s.str.repeat(3)
0 a_b_ca_b_ca_b_c
1 c_d_ec_d_ec_d_e
2 NaN
3 f_g_hf_g_hf_g_h
dtype: object
8、pad() 左右補(bǔ)齊
>>> s.str.pad(10, fillchar="?")
0 ?????a_b_c
1 ?????c_d_e
2 NaN
3 ?????f_g_h
dtype: object
>>>
>>> s.str.pad(10, side="right", fillchar="?")
0 a_b_c?????
1 c_d_e?????
2 NaN
3 f_g_h?????
dtype: object
9、center() 中間補(bǔ)齊,看例子
>>> s.str.center(10, fillchar="?")
0 ??a_b_c???
1 ??c_d_e???
2 NaN
3 ??f_g_h???
dtype: object
10、ljust() 右邊補(bǔ)齊,看例子
>>> s.str.ljust(10, fillchar="?")
0 a_b_c?????
1 c_d_e?????
2 NaN
3 f_g_h?????
dtype: object
11、rjust() 左邊補(bǔ)齊,看例子
>>> s.str.rjust(10, fillchar="?")
0 ?????a_b_c
1 ?????c_d_e
2 NaN
3 ?????f_g_h
dtype: object
12、zfill() 左邊補(bǔ)0
>>> s.str.zfill(10)
0 00000a_b_c
1 00000c_d_e
2 NaN
3 00000f_g_h
dtype: object
13、wrap() 在指定的位置加回車符號(hào)
>>> s.str.wrap(3)
0 a_b\n_c
1 c_d\n_e
2 NaN
3 f_g\n_h
dtype: object
14、slice() 按給點(diǎn)的開(kāi)始結(jié)束位置切割字符串
>>> s.str.slice(1,3)
0 _b
1 _d
2 NaN
3 _g
dtype: object
15、slice_replace() 使用給定的字符串,替換指定的位置的字符
>>> s.str.slice_replace(1, 3, "?")
0 a?_c
1 c?_e
2 NaN
3 f?_h
dtype: object
>>> s.str.slice_replace(1, 3, "??")
0 a??_c
1 c??_e
2 NaN
3 f??_h
dtype: object
16、count() 計(jì)算給定單詞出現(xiàn)的次數(shù)
>>> s.str.count("a")
0 1
1 0
2 NaN
3 0
dtype: float64
17、startswith() 判斷是否以給定的字符串開(kāi)頭
>>> s.str.startswith("a");
0 True
1 False
2 NaN
3 False
dtype: object
18、endswith() 判斷是否以給定的字符串結(jié)束
>>> s.str.endswith("e");
0 False
1 True
2 NaN
3 False
dtype: object
19、findall() 查找所有符合正則表達(dá)式的字符,以數(shù)組形式返回
>>> s.str.findall("[a-z]");
0 [a, b, c]
1 [c, d, e]
2 NaN
3 [f, g, h]
dtype: object
20、match() 檢測(cè)是否全部匹配給點(diǎn)的字符串或者表達(dá)式
>>> s
0 a_b_c
1 c_d_e
2 NaN
3 f_g_h
dtype: object
>>> s.str.match("[d-z]");
0 False
1 False
2 NaN
3 True
dtype: object
21、extract() 抽取匹配的字符串出來(lái),注意要加上括號(hào),把你需要抽取的東西標(biāo)注上
>>> s.str.extract("([d-z])");
0 NaN
1 d
2 NaN
3 f
dtype: object
22、len() 計(jì)算字符串的長(zhǎng)度
>>> s.str.len()
0 5
1 5
2 NaN
3 5
dtype: float64
23、strip() 去除前后的空白字符
>>> idx = pandas.Series([' jack', 'jill ', ' jesse ', 'frank'])
>>> idx.str.strip()
0 jack
1 jill
2 jesse
3 frank
dtype: object
24、rstrip() 去除后面的空白字符
25、lstrip() 去除前面的空白字符
26、partition() 把字符串?dāng)?shù)組切割稱為DataFrame,注意切割只是切割稱為三部分,分隔符前,分隔符,分隔符后
27、rpartition() 從右切起
>>> s.str.partition('_')
0 1 2
0 a _ b_c
1 c _ d_e
2 NaN NaN NaN
3 f _ g_h
>>> s.str.rpartition('_')
0 1 2
0 a_b _ c
1 c_d _ e
2 NaN NaN NaN
3 f_g _ h
28、lower() 全部小寫
29、upper() 全部大寫
30、find() 從左邊開(kāi)始,查找給定字符串的所在位置
>>> s.str.find('d')
0 -1
1 2
2 NaN
3 -1
dtype: float64
31、rfind() 從右邊開(kāi)始,查找給定字符串的所在位置
32、index() 查找給定字符串的位置,注意,如果不存在這個(gè)字符串,那么會(huì)報(bào)錯(cuò)!
33、rindex() 從右邊開(kāi)始查找,給定字符串的位置
>>> s.str.index('_')
0 1
1 1
2 NaN
3 1
dtype: float64
34、capitalize() 首字符大寫
>>> s.str.capitalize()
0 A_b_c
1 C_d_e
2 NaN
3 F_g_h
dtype: object
35、swapcase() 大小寫互換
>>> s.str.swapcase()
0 A_B_C
1 C_D_E
2 NaN
3 F_G_H
dtype: object
36、normalize() 序列化數(shù)據(jù),數(shù)據(jù)分析很少用到,咱們就不研究了
37、isalnum() 是否全部是數(shù)字和字母組成
>>> s.str.isalnum()
0 False
1 False
2 NaN
3 False
dtype: object
38、isalpha() 是否全部是字母
>>> s.str.isalpha()
0 False
1 False
2 NaN
3 False
dtype: object
39、isdigit() 是否全部都是數(shù)字
>>> s.str.isdigit()
0 False
1 False
2 NaN
3 False
dtype: object
40、isspace() 是否空格
>>> s.str.isspace()
0 False
1 False
2 NaN
3 False
dtype: object
41、islower() 是否全部小寫
42、isupper() 是否全部大寫
>>> s.str.islower()
0 True
1 True
2 NaN
3 True
dtype: object
>>> s.str.isupper()
0 False
1 False
2 NaN
3 False
dtype: object
43、istitle() 是否只有首字母為大寫,其他字母為小寫
>>> s.str.istitle()
0 False
1 False
2 NaN
3 False
dtype: object
44、isnumeric() 是否是數(shù)字
45、isdecimal() 是否全是數(shù)字
pandas獲取列數(shù)據(jù)位常用功能,但在寫法上還有些要注意的地方,在這里總結(jié)一下:
import pandas as pd
data1 = pd.DataFrame(...) #任意初始化一個(gè)列數(shù)為3的DataFrame
data1.columns=['a', 'b', 'c']
1.
data1['b']
#這里取到第2列(即b列)的值
2.
data1.b
#效果同1,取第2列(即b列)
#這里b為列名稱,但必須是連續(xù)字符串,不能有空格。如果列明有空格,則只能采取第1種方法
3.
data1[data1.columns[1:]]
#這里取data1的第2列和第3列的所有數(shù)據(jù)
番外1.
data1[5:10]
#這里取6到11行的所有數(shù)據(jù),而不是列數(shù)據(jù)
番外2.
data_raw_by_tick[2]
#非法,返回“KeyError: 2”
導(dǎo)出mysql數(shù)據(jù),利用pandas生成excel文檔,并發(fā)送郵件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pandas
import pandas as pd
import MySQLdb
import MySQLdb.cursors
import os
import datetime
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
#返回SQL結(jié)果的函數(shù)
def retsql(sql):
db_user = MySQLdb.connect('IP','用戶名','密碼','j數(shù)據(jù)庫(kù)名(可以不指定)',cursorclass=MySQLdb.cursors.DictCursor(設(shè)置返回結(jié)果以字典的格式))
cursor = db_user.cursor()
cursor.execute("SET NAMES utf8;"(設(shè)置字符集為utf-8,不然在返回的結(jié)果中會(huì)顯示亂碼,即使數(shù)據(jù)庫(kù)的編碼設(shè)置就是utf-8))
cursor.execute(sql)
ret = cursor.fetchall()
db_user.close()
return ret
#生成xls文件的函數(shù)
def retxls(ret,dt):
file_name = datetime.datetime.now().strftime("/path/to/store/%Y-%m-%d-%H:%M") + dt + ".sql.xlsx"
dret = pd.DataFrame.from_records(ret)
dret.to_excel(filename,"Sheet1",engine="openpyxl")###z注意openpyxl這個(gè)庫(kù)可能在生成xls的時(shí)候出錯(cuò),pip install openpyxls==1.8.6,其他版本似乎與pandas有點(diǎn)沖突,安裝1.8.6的即可
print "Ok!!! the file in",file_name
return filename
#發(fā)送郵件的函數(shù)
##傳入主題,顯示名,目標(biāo)郵箱,附件名
def sendm(sub,cttstr,to_list,file):
msg = MIMEMultipart()
att = MIMEText(open(file,'rb').read(),"base64","utf-8")
att["Content-Type"] = "application/octet-stream"
att["Content-Disposition"] = 'attachment; filename="sql查詢結(jié)果.xlsx"'
msg['from'] = '發(fā)件人地址'
msg['subject'] = sub
ctt = MIMEText(cttstr,'plain','utf-8')
msg.attach(att)
msg.attach(ctt)
try:
server = smtplib.SMTP()
#server.set_debuglevel(1) ###如果問(wèn)題可打開(kāi)此選項(xiàng)以便調(diào)試
server.connect("mail.example.com",'25')
server.starttls() ###如果開(kāi)啟了ssl或者tls加密,開(kāi)啟加密
server.login("可用郵箱用戶名","密碼")
server.sendmail(msg['from'],to_list,msg.as_string())
server.quit()
print 'ok!!!'
except Exception,e:
print str(e)
###想要查詢的sql語(yǔ)句
sql="""sql語(yǔ)句"""
#接收郵件的用戶列表
to_list = ['test1@example.com',
'test2@example.com']
#執(zhí)行sql并將結(jié)果傳遞給ret
ret = retsql(sql)
#將結(jié)果文件路徑結(jié)果傳給retfile
retfile = retxls(ret,"1")
#發(fā)送郵件
#發(fā)送sql語(yǔ)句內(nèi)容
sendm(sub1,sub1,to_list,retfile1)
Python之ipython、notebook、matplotlib安裝使用
#!/usr/bin/python
# -*- coding: UTF-8 -*-
以下進(jìn)行逐步安裝配置
python 3.5.2, ipython 5.1.0, jupyter notebook, matplotlib
1、安裝python3.5
具體安裝請(qǐng)參考官方文檔。安裝程序時(shí)注意勾選配置環(huán)境變量。https://www.python.org/downloads/windows/
2、升級(jí)pip
python -m pip install --upgrade pip
3、使用pip安裝ipython
pip.exe install ipython
4、使用pip安裝notebook
pip install notebook
5、安裝畫(huà)圖工具 matplotlib
pip install matplotlib
pip install matplotlib --upgrade
6、實(shí)例
import numpy as np
import matplotlib.pyplot as plt
N = 5
menMeans = (20, 35, 30, 35, 27)
menStd = (2, 3, 4, 1, 2)
ind = np.arange(N) # the x locations for the groups
width = 0.35 # the width of the bars
fig, ax = plt.subplots()
rects1 = ax.bar(ind, menMeans, width, color='r', yerr=menStd)
womenMeans = (25, 32, 34, 20, 25)
womenStd = (3, 5, 2, 3, 3)
rects2 = ax.bar(ind+width, womenMeans, width, color='y', yerr=womenStd)
# add some
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(ind+width)
ax.set_xticklabels( ('G1', 'G2', 'G3', 'G4', 'G5') )
ax.legend( (rects1[0], rects2[0]), ('Men', 'Women') )
def autolabel(rects):
# attach some text labels
for rect in rects:
height = rect.get_height()
ax.text(rect.get_x()+rect.get_width()/2., 1.05*height, '%d'%int(height),
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(9)
y = np.sin(x)
plt.plot(x,y)
plt.show()
import matplotlib.pyplot as plt
plt.bar(left = 0,height = 1)
plt.show()
首先我們import了matplotlib.pyplot ,然后直接調(diào)用其bar方法,最后用show顯示圖像。
我解釋一下bar中的兩個(gè)參數(shù):
left:柱形的左邊緣的位置,如果我們指定1那么當(dāng)前柱形的左邊緣的x值就是1.0了
height:這是柱形的高度,也就是Y軸的值了
left,height除了可以使用單獨(dú)的值(此時(shí)是一個(gè)柱形),也可以使用元組來(lái)替換(此時(shí)代表多個(gè)矩形)。例如,下面的例子:
import matplotlib.pyplot as plt
plt.bar(left = (0,1),height = (1,0.5))
plt.show()
可以看到 left = (0,1)的意思就是總共有兩個(gè)矩形,第一個(gè)的左邊緣為0,第二個(gè)的左邊緣為1。height參數(shù)同理。
當(dāng)然,可能你還覺(jué)得這兩個(gè)矩形“太胖”了。此時(shí)我們可以通過(guò)指定bar的width參數(shù)來(lái)設(shè)置它們的寬度。
import matplotlib.pyplot as plt
plt.bar(left = (0,1),height = (1,0.5),width = 0.35)
plt.show()
此時(shí)又來(lái)需求了,我需要標(biāo)明x,y軸的說(shuō)明。比如x軸是性別,y軸是人數(shù)。實(shí)現(xiàn)也很簡(jiǎn)單,看代碼:
import matplotlib.pyplot as plt
plt.xlabel(u'性別')
plt.ylabel(u'人數(shù)')
plt.bar(left = (0,1),height = (1,0.5),width = 0.35)
plt.show()
注意這里的中文一定要用u(3.0以上好像不用,我用的2.7),因?yàn)閙atplotlib只支持unicode。接下來(lái),讓我們?cè)趚軸上的每個(gè)bar進(jìn)行說(shuō)明。比如第一個(gè)是“男”,第二個(gè)是“女”。
import matplotlib.pyplot as plt
plt.xlabel(u'性別')
plt.ylabel(u'人數(shù)')
plt.xticks((0,1),(u'男',u'女'))
plt.bar(left = (0,1),height = (1,0.5),width = 0.35)
plt.show()
plt.xticks的用法和我們前面說(shuō)到的left,height的用法差不多。如果你有幾個(gè)bar,那么就是幾維的元組。第一個(gè)是文字的位置,第二個(gè)是具體的文字說(shuō)明。不過(guò)這里有個(gè)問(wèn)題,很顯然我們指定的位置有些“偏移”,最理想的狀態(tài)應(yīng)該在每個(gè)矩形的中間。你可以更改(0,1)=>( (0+0.35)/2 ,(1+0.35)/2 )不過(guò)這樣比較麻煩。我們可以通過(guò)直接指定bar方法里面的align="center"就可以讓文字居中了。
import matplotlib.pyplot as plt
plt.xlabel(u'性別')
plt.ylabel(u'人數(shù)')
plt.xticks((0,1),(u'男',u'女'))
plt.bar(left = (0,1),height = (1,0.5),width = 0.35,align="center")
plt.show()
接下來(lái),我們還可以給圖標(biāo)加入標(biāo)題。當(dāng)然,還有圖例也少不掉:
import matplotlib.pyplot as plt
plt.xlabel(u'性別')
plt.ylabel(u'人數(shù)')
plt.title(u"性別比例分析")
plt.xticks((0,1),(u'男',u'女'))
rect = plt.bar(left = (0,1),height = (1,0.5),width = 0.35,align="center")
plt.legend((rect,),(u"圖例",))
plt.show()
注意這里的legend方法,里面的參數(shù)必須是元組。即使你只有一個(gè)圖例,不然顯示不正確。
接下來(lái),我們還可以在每個(gè)矩形的上面標(biāo)注它具體點(diǎn)Y值。這里,我們需要用到一個(gè)通用的方法:
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2., 1.03*height, '%s' % float(height))
其中plt.text的參數(shù)分別是:x坐標(biāo),y坐標(biāo),要顯示的文字。所以,調(diào)用代碼如下:
import matplotlib.pyplot as plt
def autolabel(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2., 1.03*height, '%s' % float(height))
plt.xlabel(u'性別')
plt.ylabel(u'人數(shù)')
plt.title(u"性別比例分析")
plt.xticks((0,1),(u'男',u'女'))
rect = plt.bar(left = (0,1),height = (1,0.5),width = 0.35,align="center")
plt.legend((rect,),(u"圖例",))
autolabel(rect)
plt.show()
matplotlib所繪制的圖表的每個(gè)組成部分都和一個(gè)對(duì)象對(duì)應(yīng),我們可以通過(guò)調(diào)用這些對(duì)象的屬性設(shè)置方法set_*()或者pyplot模塊的屬性設(shè)置函數(shù)setp()設(shè)置它們的屬性值。
因?yàn)閙atplotlib實(shí)際上是一套面向?qū)ο蟮睦L圖庫(kù),因此也可以直接獲取對(duì)象的屬性
配置文件
繪制一幅圖需要對(duì)許多對(duì)象的屬性進(jìn)行配置,例如顏色、字體、線型等等。我們?cè)诶L圖時(shí),并沒(méi)有逐一對(duì)這些屬性進(jìn)行配置,許多都直接采用了matplotlib的缺省配置。
matplotlib將這些缺省配置保存在一個(gè)名為“matplotlibrc”的配置文件中,通過(guò)修改配置文件,我們可以修改圖表的缺省樣式。配置文件的讀入可以使用rc_params(),它返回一個(gè)配置字典;在matplotlib模塊載入時(shí)會(huì)調(diào)用rc_params(),并把得到的配置字典保存到rcParams變量中;matplotlib將使用rcParams字典中的配置進(jìn)行繪圖;用戶可以直接修改此字典中的配置,所做的改變會(huì)反映到此后創(chuàng)建的繪圖元素。
繪制多子圖(快速繪圖)
Matplotlib 里的常用類的包含關(guān)系為 Figure -> Axes -> (Line2D, Text, etc.)一個(gè)Figure對(duì)象可以包含多個(gè)子圖(Axes),在matplotlib中用Axes對(duì)象表示一個(gè)繪圖區(qū)域,可以理解為子圖。
可以使用subplot()快速繪制包含多個(gè)子圖的圖表,它的調(diào)用形式如下:
subplot(numRows, numCols, plotNum)
subplot將整個(gè)繪圖區(qū)域等分為numRows行* numCols列個(gè)子區(qū)域,然后按照從左到右,從上到下的順序?qū)γ總€(gè)子區(qū)域進(jìn)行編號(hào),左上的子區(qū)域的編號(hào)為1。
如果numRows,numCols和plotNum這三個(gè)數(shù)都小于10的話,可以把它們縮寫為一個(gè)整數(shù),例如subplot(323)和subplot(3,2,3)是相同的。
subplot在plotNum指定的區(qū)域中創(chuàng)建一個(gè)軸對(duì)象。如果新創(chuàng)建的軸和之前創(chuàng)建的軸重疊的話,之前的軸將被刪除。
subplot()返回它所創(chuàng)建的Axes對(duì)象,我們可以將它用變量保存起來(lái),然后用sca()交替讓它們成為當(dāng)前Axes對(duì)象,并調(diào)用plot()在其中繪圖。
繪制多圖表(快速繪圖)
如果需要同時(shí)繪制多幅圖表,可以給figure()傳遞一個(gè)整數(shù)參數(shù)指定Figure對(duì)象的序號(hào),如果序號(hào)所指定的Figure對(duì)象已經(jīng)存在,將不創(chuàng)建新的對(duì)象,而只是讓它成為當(dāng)前的Figure對(duì)象。
import numpy as np
import matplotlib.pyplot as plt
plt.figure(1) # 創(chuàng)建圖表1
plt.figure(2) # 創(chuàng)建圖表2
ax1 = plt.subplot(211) # 在圖表2中創(chuàng)建子圖1
ax2 = plt.subplot(212) # 在圖表2中創(chuàng)建子圖2
x = np.linspace(0, 3, 100)
for i in xrange(5):
plt.figure(1) # # 選擇圖表1
plt.plot(x, np.exp(i*x/3))
plt.sca(ax1) # # 選擇圖表2的子圖1
plt.plot(x, np.sin(i*x))
plt.sca(ax2) # 選擇圖表2的子圖2
plt.plot(x, np.cos(i*x))
plt.show()
在圖表中顯示中文
matplotlib的缺省配置文件中所使用的字體無(wú)法正確顯示中文。為了讓圖表能正確顯示中文,可以有幾種解決方案。
在程序中直接指定字體。
在程序開(kāi)頭修改配置字典rcParams。
修改配置文件。
比較簡(jiǎn)便的方式是,中文字符串用unicode格式,例如:u''測(cè)試中文顯示'',代碼文件編碼使用utf-8 加上" # coding = utf-8 "一行。
matplotlib輸出圖象的中文顯示問(wèn)題
面向?qū)ο螽?huà)圖
matplotlib API包含有三層,Artist層處理所有的高層結(jié)構(gòu),例如處理圖表、文字和曲線等的繪制和布局。通常我們只和Artist打交道,而不需要關(guān)心底層的繪制細(xì)節(jié)。
直接使用Artists創(chuàng)建圖表的標(biāo)準(zhǔn)流程如下:
創(chuàng)建Figure對(duì)象
用Figure對(duì)象創(chuàng)建一個(gè)或者多個(gè)Axes或者Subplot對(duì)象
調(diào)用Axies等對(duì)象的方法創(chuàng)建各種簡(jiǎn)單類型的Artists
import matplotlib.pyplot as plt
X1 = range(0, 50) Y1 = [num**2 for num in X1] # y = x^2 X2 = [0, 1] Y2 = [0, 1] # y = x
Fig = plt.figure(figsize=(8,4)) # Create a `figure' instance
Ax = Fig.add_subplot(111) # Create a `axes' instance in the figure
Ax.plot(X1, Y1, X2, Y2) # Create a Line2D instance in the axes
Fig.show()
Fig.savefig("test.pdf")
matplotlib還提供了一個(gè)名為pylab的模塊,其中包括了許多NumPy和pyplot模塊中常用的函數(shù),方便用戶快速進(jìn)行計(jì)算和繪圖,十分適合在IPython交互式環(huán)境中使用。這里使用下面的方式載入pylab模塊:
>>> import pylab as pl
1 安裝numpy和matplotlib
>>> import numpy
>>> numpy.__version__
>>> import matplotlib
>>> matplotlib.__version__
2 兩種常用圖類型:Line and scatter plots(使用plot()命令), histogram(使用hist()命令)
2.1 折線圖&散點(diǎn)圖 Line and scatter plots
2.1.1 折線圖 Line plots(關(guān)聯(lián)一組x和y值的直線)
import numpy as np
import pylab as pl
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]
pl.plot(x, y)
pl.show()
2.1.2 散點(diǎn)圖 Scatter plots
把pl.plot(x, y)改成pl.plot(x, y, 'o')即可,下圖的藍(lán)色版本
2.2 美化 Making things look pretty
2.2.1 線條顏色 Changing the line color
紅色:把pl.plot(x, y, 'o')改成pl.plot(x, y, ’or’)
2.2.2 線條樣式 Changing the line style
虛線:plot(x,y, '--')
2.2.3 marker樣式 Changing the marker style
藍(lán)色星型markers:plot(x,y, ’b*’)
2.2.4 圖和軸標(biāo)題以及軸坐標(biāo)限度 Plot and axis titles and limits
import numpy as np
import pylab as pl
x = [1, 2, 3, 4, 5]# Make an array of x values
y = [1, 4, 9, 16, 25]# Make an array of y values for each x value
pl.plot(x, y)# use pylab to plot x and y
pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)
pl.xlim(0.0, 7.0)# set axis limits
pl.ylim(0.0, 30.)
pl.show()# show the plot on the screen
2.2.5 在一個(gè)坐標(biāo)系上繪制多個(gè)圖 Plotting more than one plot on the same set of axes
做法是很直接的,依次作圖即可:
import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]
pl.plot(x1, y1, ’r’)# use pylab to plot x and y
pl.plot(x2, y2, ’g’)
pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)
pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)
pl.show()# show the plot on the screen
2.2.6 圖例 Figure legends
pl.legend((plot1, plot2), (’label1, label2’), 'best’, numpoints=1)
其中第三個(gè)參數(shù)表示圖例放置的位置:'best’‘upper right’, ‘upper left’, ‘center’, ‘lower left’, ‘lower right’.
如果在當(dāng)前figure里plot的時(shí)候已經(jīng)指定了label,如plt.plot(x,z,label="cos(x2)"),直接調(diào)用plt.legend()就可以了哦。
import numpy as np
import pylab as pl
x1 = [1, 2, 3, 4, 5]# Make x, y arrays for each graph
y1 = [1, 4, 9, 16, 25]
x2 = [1, 2, 4, 6, 8]
y2 = [2, 4, 8, 12, 16]
plot1 = pl.plot(x1, y1, ’r’)# use pylab to plot x and y : Give your plots names
plot2 = pl.plot(x2, y2, ’go’)
pl.title(’Plot of y vs. x’)# give plot a title
pl.xlabel(’x axis’)# make axis labels
pl.ylabel(’y axis’)
pl.xlim(0.0, 9.0)# set axis limits
pl.ylim(0.0, 30.)
pl.legend([plot1, plot2], (’red line’, ’green circles’), ’best’, numpoints=1) # make legend
pl.show()# show the plot on the screen
2.3 直方圖 Histograms
import numpy as np
import pylab as pl
# make an array of random numbers with a gaussian distribution with
# mean = 5.0
# rms = 3.0
# number of points = 1000
data = np.random.normal(5.0, 3.0, 1000)
# make a histogram of the data array
pl.hist(data)
# make plot labels
pl.xlabel(’data’)
pl.show()
如果不想要黑色輪廓可以改為pl.hist(data, histtype=’stepfilled’)
2.3.1 自定義直方圖bin寬度 Setting the width of the histogram bins manually
增加這兩行
bins = np.arange(-5., 16., 1.) #浮點(diǎn)數(shù)版本的range
pl.hist(data, bins, histtype=’stepfilled’)
3 同一畫(huà)板上繪制多幅子圖 Plotting more than one axis per canvas
如果需要同時(shí)繪制多幅圖表的話,可以是給figure傳遞一個(gè)整數(shù)參數(shù)指定圖標(biāo)的序號(hào),如果所指定
序號(hào)的繪圖對(duì)象已經(jīng)存在的話,將不創(chuàng)建新的對(duì)象,而只是讓它成為當(dāng)前繪圖對(duì)象。
fig1 = pl.figure(1)
pl.subplot(211)
subplot(211)把繪圖區(qū)域等分為2行*1列共兩個(gè)區(qū)域, 然后在區(qū)域1(上區(qū)域)中創(chuàng)建一個(gè)軸對(duì)象. pl.subplot(212)在區(qū)域2(下區(qū)域)創(chuàng)建一個(gè)軸對(duì)象。
import numpy as np
import pylab as pl
# Use numpy to load the data contained in the file
# ’fakedata.txt’ into a 2-D array called data
data = np.loadtxt(’fakedata.txt’)
# plot the first column as x, and second column as y
pl.plot(data[:,0], data[:,1], ’ro’)
pl.xlabel(’x’)
pl.ylabel(’y’)
pl.xlim(0.0, 10.)
pl.show()
4.2 寫入數(shù)據(jù)到文件 Writing data to a text file
寫文件的方法也很多,這里只介紹一種可用的寫入文本文件的方法,更多的可以參考官方文檔。
import numpy as np
# Let’s make 2 arrays (x, y) which we will write to a file
# x is an array containing numbers 0 to 10, with intervals of 1
x = np.arange(0.0, 10., 1.)
# y is an array containing the values in x, squared
y = x*x
print ’x = ’, x
print ’y = ’, y
# Now open a file to write the data to
# ’w’ means open for ’writing’
file = open(’testdata.txt’, ’w’)
# loop over each line you want to write to file
for i in range(len(x)):
# make a string for each line you want to write
# ’\t’ means ’tab’
# ’\n’ means ’newline’
# ’str()’ means you are converting the quantity in brackets to a string type
txt = str(x[i]) + ’\t’ + str(y[i]) + ’ \n’
# write the txt to the file
file.write(txt)
# Close your file
file.close()
圖例1
import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
# Example data
people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
error = np.random.rand(len(people))
#barh(bottom, width, height=0.8, left=0, **kwargs)
plt.barh(y_pos, performance, xerr=error, height=0.8,align='center',alpha=0.4)
plt.yticks(y_pos, people)
plt.xlabel('Performance')
plt.title('How fast do you want to go today?')
plt.show()
圖例 2
import numpy as np
import matplotlib.pyplot as plt
import pylab
from matplotlib.ticker import MaxNLocator
grade = 2
day = '2014-06-22' # Today in this year
numTests = 5
testNames = ['swap','memory', '/project', '/backup', '/root']
testMeta = ['', '', '', '','']
scores = [98,79, 39, 92,17]
lastweek_scores = ['97%','35%','86%','21%','70%']
#rankings = np.round(np.random.uniform(0, 1, numTests)*100, 0)
rankings = 3 + 10 * np.random.rand(numTests)
fig, ax1 = plt.subplots(figsize=(9, 7))
plt.subplots_adjust(left=0.115, right=0.88)
fig.canvas.set_window_title('Usage Chart')
pos = np.arange(numTests)+0.5 # Center bars on the Y-axis ticks
rects = ax1.barh(pos, scores, align='center', height=0.5, color='m')
ax1.axis([0, 100, 0, 5])
pylab.yticks(pos, testNames)
ax1.set_title('Server 18.32 Usage Chart')
plt.text(50, -0.5, 'date: ' + day,
horizontalalignment='center', size='small')
# Set the right-hand Y-axis ticks and labels and set X-axis tick marks at the
# deciles
ax2 = ax1.twinx()
ax2.plot([100, 100], [0, 5], 'white', alpha=0.1)
ax2.xaxis.set_major_locator(MaxNLocator(11))
xticks = pylab.setp(ax2, xticklabels=['0', '10', '20', '30', '40', '50', '60',
'70', '80', '90', '100'])
ax2.xaxis.grid(True, linestyle='--', which='major', color='grey',
alpha=0.25)
#Plot a solid vertical gridline to highlight the median position
plt.plot([50, 50], [0, 5], 'grey', alpha=0.25)
# Build up the score labels for the right Y-axis by first appending a carriage
# return to each string and then tacking on the appropriate meta information
# (i.e., 'laps' vs 'seconds'). We want the labels centered on the ticks, so if
# there is no meta info (like for pushups) then don't add the carriage return to
# the string
def withnew(i, scr):
if testMeta[i] != '':
return '%s\n' % scr
else:
return scr
scoreLabels = [withnew(i, scr) for i, scr in enumerate(lastweek_scores)]
scoreLabels = [i+j for i, j in zip(scoreLabels, testMeta)]
# set the tick locations
ax2.set_yticks(pos)
# set the tick labels
ax2.set_yticklabels(scoreLabels)
# make sure that the limits are set equally on both yaxis so the ticks line up
ax2.set_ylim(ax1.get_ylim())
ax2.set_ylabel("Last Week's data",color='sienna')
#Make list of numerical suffixes corresponding to position in a list
# 0 1 2 3 4 5 6 7 8 9
suffixes = ['%', '%', '%', '%', '%', '%', '%', '%', '%', '%']
ax2.set_xlabel('Percentile Ranking Across ' + suffixes[grade]
+ ' Grade ' + 's')
# Lastly, write in the ranking inside each bar to aid in interpretation
for rect in rects:
# Rectangle widths are already integer-valued but are floating
# type, so it helps to remove the trailing decimal point and 0 by
# converting width to int type
width = int(rect.get_width())
# Figure out what the last digit (width modulo 10) so we can add
# the appropriate numerical suffix (e.g., 1st, 2nd, 3rd, etc)
lastDigit = width % 10
# Note that 11, 12, and 13 are special cases
if (width == 11) or (width == 12) or (width == 13):
suffix = 'th'
else:
suffix = suffixes[lastDigit]
rankStr = str(width) + suffix
if (width < 5): # The bars aren't wide enough to print the ranking inside
xloc = width + 1 # Shift the text to the right side of the right edge
clr = 'black' # Black against white background
align = 'left'
else:
xloc = 0.98*width # Shift the text to the left side of the right edge
clr = 'white' # White on magenta
align = 'right'
# Center the text vertically in the bar
yloc = rect.get_y()+rect.get_height()/2.0
ax1.text(xloc, yloc, rankStr, horizontalalignment=align,
verticalalignment='center', color=clr, weight='bold')
plt.show()
python結(jié)合matplotlib,統(tǒng)計(jì)svn的代碼提交量
安裝所需的依賴包
yum install -y numpy matplotlib
matplotlib.pyplot是一些命令行風(fēng)格函數(shù)的集合,使matplotlib以類似于MATLAB的方式工作。每個(gè)pyplot函數(shù)對(duì)一幅圖片(figure)做一些改動(dòng):比如創(chuàng)建新圖片,在圖片創(chuàng)建一個(gè)新的作圖區(qū)域(plotting area),在一個(gè)作圖區(qū)域內(nèi)畫(huà)直線,給圖添加標(biāo)簽(label)等。matplotlib.pyplot是有狀態(tài)的,亦即它會(huì)保存當(dāng)前圖片和作圖區(qū)域的狀態(tài),新的作圖函數(shù)會(huì)作用在當(dāng)前圖片的狀態(tài)基礎(chǔ)之上。
import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
上圖的X坐標(biāo)是1-3,縱坐標(biāo)是1-4,這是因?yàn)槿绻阒惶峁┙oplot()函數(shù)一個(gè)列表或數(shù)組,matplotlib會(huì)認(rèn)為這是一串Y值(Y向量),并且自動(dòng)生成X值(X向量)。而Python一般是從0開(kāi)始計(jì)數(shù)的,所以X向量有和Y向量一樣的長(zhǎng)度(此處是4),但是是從0開(kāi)始,所以X軸的值為[0,1,2,3]。
也可以給plt.plot()函數(shù)傳遞多個(gè)序列(元組或列表),每?jī)蓚€(gè)序列是一個(gè)X,Y向量對(duì),在圖中構(gòu)成一條曲線,這樣就會(huì)在同一個(gè)圖里存在多條曲線。
為了區(qū)分同一個(gè)圖里的多條曲線,可以為每個(gè)X,Y向量對(duì)指定一個(gè)參數(shù)來(lái)標(biāo)明該曲線的表現(xiàn)形式,默認(rèn)的參數(shù)是'b-',亦即藍(lán)色的直線,如果想用紅色的圓點(diǎn)來(lái)表示這條曲線,可以:
import matplotlib.pyplot as plt
plt.plot([1,2,3,4],[1,4,9,16],'ro')
plt.axis([0,6,0,20])
axis()函數(shù)接受形如[xmin,xmax,ymin,ymax]的參數(shù),指定了X,Y軸坐標(biāo)的范圍。
matplotlib不僅僅可以使用序列(列表和元組)作為參數(shù),還可以使用numpy數(shù)組。實(shí)際上,所有的序列都被內(nèi)在的轉(zhuǎn)化為numpy數(shù)組。
import numpy as np
import matplotlib.pyplot as plt
t=np,arange(0.,5.,0.2)
plt.plot(t,t,'r--',t,t**2,'bs',t,t**3,'g^')
控制曲線的屬性
曲線有許多我們可以設(shè)置的性質(zhì):曲線的寬度,虛線的風(fēng)格,抗鋸齒等等。有多種設(shè)置曲線屬性的方法:
1.使用關(guān)鍵詞參數(shù):
plt.plot(x,y,linewidth=2.0)
2.使用Line2D實(shí)例的設(shè)置(Setter)方法。plot()返回的是曲線的列表,比如line1,line2=plot(x1,y1,x2,y2).我們?nèi)〉胮lot()函數(shù)返回的曲線之后用Setter方法來(lái)設(shè)置曲線的屬性。
line,=plt.plot(x,y,'-')
line.set)antialliased(False) #關(guān)閉抗鋸齒
3.使用setp()命令:
lines=plt.plot(x1,y1,x2,y2)
plt.setp(lines,color='r',linewidth=2.0)
plt.setp(lines,'color','r','linewidth','2.0')
處理多個(gè)圖和Axe
MATLAB和pyplot都有當(dāng)前圖和當(dāng)前axe的概念。所有的作圖命令都作用在當(dāng)前axe。
函數(shù)gca()返回當(dāng)前axe,gcf()返回當(dāng)前圖。
復(fù)制代碼
import numpy as np
import matplotlib.pyplot as plt
def f(t):
return np.exp(-t) * np.cos(2*np.pi*t)
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
plt.figure(1)
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
figure()命令是可選的,因?yàn)閒igure(1)會(huì)被默認(rèn)創(chuàng)建,subplot(111)也會(huì)被默認(rèn)創(chuàng)建。
subplot()命令會(huì)指定numrows,numcols,fignum,其中fignum的取值范圍為從1到numrows*numcols。如果numrows*numcols小于10則subplot()命令中的逗號(hào)是可選的。所以subplot(2,1,1)與subplot(211)是完全一樣的。
如果你想手動(dòng)放置axe,而不是放置在矩形方格內(nèi),則可以使用axes()命令,其中的參數(shù)為axes([left,bottom,width,height]),每個(gè)參數(shù)的取值范圍為(0,1)。
你可以使用多個(gè)figure()來(lái)創(chuàng)建多個(gè)圖,每個(gè)圖都可以有多個(gè)axe和subplot:
復(fù)制代碼
import matplotlib.pyplot as plt
plt.figure(1) # the first figure
plt.subplot(211) # the first subplot in the first figure
plt.plot([1,2,3])
plt.subplot(212) # the second subplot in the first figure
plt.plot([4,5,6])
plt.figure(2) # a second figure
plt.plot([4,5,6]) # creates a subplot(111) by default
plt.figure(1) # figure 1 current; subplot(212) still current
plt.subplot(211) # make subplot(211) in figure1 current
plt.title('Easy as 1,2,3') # subplot 211 title
復(fù)制代碼
你可以使用clf()和cla()命令來(lái)清空當(dāng)前figure和當(dāng)前axe。
如果你創(chuàng)建了許多圖,你需要顯示的使用close()命令來(lái)釋放該圖所占用的內(nèi)存,僅僅關(guān)閉顯示在屏幕上的圖是不會(huì)釋放內(nèi)存空間的。
處理文本
text()命令可以用來(lái)在任意位置上添加文本,xlabel(),ylabel(),title()可以用來(lái)在X軸,Y軸,標(biāo)題處添加文本。
復(fù)制代碼
import numpy as np
import matplotlib.pyplot as plt
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
# the histogram of the data
n, bins, patches = plt.hist(x, 50, normed=1, facecolor='g', alpha=0.75)
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
每個(gè)text()命令都會(huì)返回一個(gè)matplotlib.text.Text實(shí)例,就像之前處理曲線一樣,你可以通過(guò)使用setp()函數(shù)來(lái)傳遞關(guān)鍵詞參數(shù)來(lái)定制文本的屬性。
t=plt.xlabel('my data',fontsize=14,color='red')
在文本中使用數(shù)學(xué)表達(dá)式
matplotlib在任何文本中都接受Text表達(dá)式。
Tex表達(dá)式是有兩個(gè)dollar符號(hào)環(huán)繞起來(lái)的,比如math-4cd9a23707.png的Tex表達(dá)式如下
plt.title(r'$\sigma_i=15$')
用python的matplotlib畫(huà)標(biāo)準(zhǔn)正態(tài)曲線
import math
import pylab as pl
import numpy as np
def gd(x,m,s):
left=1/(math.sqrt(2*math.pi)*s)
right=math.exp(-math.pow(x-m,2)/(2*math.pow(s,2)))
return left*right
def showfigure():
x=np.arange(-4,5,0.1)
y=[]
for i in x:
y.append(gd(i,0,1))
pl.plot(x,y)
pl.xlim(-4.0,5.0)
pl.ylim(-0.2,0.5)
#
ax = pl.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
#add param
label_f1 = "$\mu=0,\ \sigma=1$"
pl.text(2.5,0.3,label_f1,fontsize=15,verticalalignment="top",
horizontalalignment="left")
label_f2 = r"$f(x)=\frac{1}{\sqrt{2\pi}\sigma}exp(-\frac{(x-\mu)^2}{2\sigma^2})$"
pl.text(1.5,0.4,label_f2,fontsize=15,verticalalignment="top"
,horizontalalignment="left")
pl.show()
python數(shù)據(jù)可視化matplotlib的使用
# -*- coding:UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
from pylab import mpl
import sys
reload(sys)
sys.setdefaultencoding('utf8')
xmajorLocator = MultipleLocator(10* 1) #將x軸主刻度標(biāo)簽設(shè)置為10* 1的倍數(shù)
ymajorLocator = MultipleLocator(0.1* 1) #將y軸主刻度標(biāo)簽設(shè)置為0.1 * 1的倍數(shù)
# 設(shè)置中文字體
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 導(dǎo)入文件數(shù)據(jù)
#data = np.loadtxt('test44.txt', delimiter=None, dtype=float )
#data = [[1,2],[3,4],[5,6]]
data = [[1,5,10,20,30,40,50,60,70,80,90,100],[0.0201,0.0262,0.0324,0.0295,0.0221,0.0258,0.0254,0.0299,0.0275,0.0299,0.0291,0.0328],
[0.0193,0.0254,0.0234,0.0684,0.0693,0.0803,0.1008,0.098,0.0947,0.0934,0.1971,0.2123],[0.0209,0.1176,0.2143,0.2295,0.4176,0.5258,0.6471,0.6484,0.8193,0.829,0.832,0.943]]
data = np.array(data)
# 截取數(shù)組數(shù)據(jù)
x = data[0] #時(shí)間
y = data[1] # 類別一的Y值
y2 = data[2] #類別二的Y值
y3 = data[3] #類別三的Y值
plt.figure(num=1, figsize=(8, 6))
ax = plt.subplot(111)
ax.xaxis.set_major_locator(xmajorLocator)
ax.yaxis.set_major_locator(ymajorLocator)
ax.xaxis.grid(True, which='major') #x坐標(biāo)軸的網(wǎng)格使用主刻度
ax.yaxis.grid(True, which='major') #x坐標(biāo)軸的網(wǎng)格使用主刻度
plt.xlabel('時(shí)間/t',fontsize='xx-large')#Valid font size are large, None, medium, smaller, small, x-large, xx-small, larger, x-small, xx-large
plt.ylabel('y-label',fontsize='xx-large')
plt.title('Title',fontsize='xx-large')
plt.xlim(0, 110)
plt.ylim(0, 1)
line1, = ax.plot(x, y, 'g.-',label="類別一",)
line2, = ax.plot(x,y2,'b*-',label="類別二",)
line3, = ax.plot(x,y3,'rD-',label="類別三",)
ax.legend((line1, line2,line3),('類別一','類別二','類別三'),loc=5) # loc可為1、2、3、4、5、6,分別為不同的位置
plt.show()
python matplotlib 生成x的三次方曲線圖
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-100,100,100)
y = x**3
plt.figure(num=3,figsize=(8,5)) #num xuhao;figsize long width
l1=plt.plot(x,y,'p') # quta is to return name to plt.legend(handles)
plt.xlim((-100,100))
plt.ylim((-100000,100000))
plt.xlabel('X') #x zhou label
plt.ylabel('Y')
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none') ##don't display border
ax.xaxis.set_ticks_position('bottom') ##set x zhou
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0)) #y 0 postition is x position
ax.spines['left'].set_position(('data',0))
###tu li
# labels can just set one label just post one line
plt.legend(handles=l1,labels='y=x**3',loc='best') ##loc=location
plt.show()
python matplotlib 繪制三次函數(shù)圖像
>>> from matplotlib import pyplot as pl
>>> import numpy as np
>>> from scipy import interpolate
>>> x = np.linspace(-10, 5, 100)
>>> y = -2*x**3 + 5*x**2 + 9
>>> pl.figure(figsize = (8, 4))
>>> pl.plot(x, y, color="blue", linewidth = 1.5)
[]
>>> pl.show()
pl.figure 設(shè)置繪圖區(qū)大小
pl.plot 開(kāi)始繪圖, 并設(shè)置線條顏色, 以及線條寬度
pl.show 顯示圖像
python生成20個(gè)隨機(jī)的DNA fasta格式文件
生成20個(gè)隨機(jī)的文件, 由于沒(méi)有用到hash名字,文件名有可能會(huì)重復(fù)
每個(gè)文件中有30-50條序列 每條序列的長(zhǎng)度為70-120個(gè)堿基
import os
import random
import string
print (dir(string))
letter = string.ascii_letters
os.chdir("D:\\")
bases = {1:"A", 2:"T", 3:"C", 4:"G"}
## Test random module , get random DNA base
Nth = random.randint(1,4)
print (bases[Nth])
## Create random DNA sequences
for i in range(20):
Number_of_Seq = random.randint(30,50)
filename = letter[i]
with open("Sequences"+filename + \
str(Number_of_Seq)+ ".fasta", "w") as file_output:
for j in range(Number_of_Seq):
each_Seq=""
Rand_len = random.randint(70,120)
for k in range(Rand_len):
Nth = random.randint(1,4)
each_Seq += bases[Nth]
file_output.write(">seq_"+str(Number_of_Seq)+ \
"_"+str(Rand_len)+"\n")
file_output.write(each_Seq+"\n")
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。