matplotlib 進(jìn)階之Artist tutorial(如何操作Atrist和定制)

matplotlib教程學(xué)習(xí)筆記

基本

有倆種Artist:primitives(圖形元素)和containers(容器)的畴。primitives是我們需要加入圖片的元素,比如線條足淆,矩形巢块,文字等,而容器是放置這些元素的地方巧号,比如Axis,Axes和Figure族奢。標(biāo)準(zhǔn)的用法,應(yīng)該是先建立一個(gè)Figure對(duì)象丹鸿,再創(chuàng)建數(shù)個(gè)Axes對(duì)象越走,然后再添加圖形元素。

plt.figure()

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(2, 1, 1) #倆行一列, ax為第一個(gè)Plot

Axes是最多使用的靠欢,大部分圖形元素都會(huì)添加于其中廊敌,我們可以利用add_axes()來(lái)隨時(shí)隨地添加Axes。

fig.add_axes()

fig2 = plt.figure()
ax2 = fig2.add_axes([0.15, 0.1, 0.6, 0.5]) #[left right width height]

繼續(xù)畫圖:

ax.lines

t = np.arange(0, 1, 0.01)
s = np.sin(2*np.pi*t)
line, = ax.plot(t, s, color="blue", lw=2)
在這里插入圖片描述

在這個(gè)例子中门怪,ax是Axes實(shí)例骡澈,通過(guò)fig.add_subplot創(chuàng)建(subplot是Axes的一個(gè)子類),當(dāng)你運(yùn)行ax.plot的時(shí)候掷空,它創(chuàng)建了一個(gè)Line2D實(shí)例肋殴,并將此元素添加到Axes.lines.list中,從下面我們可以看到坦弟,這個(gè)線疼电,與返回得到的線line是一樣的:

print(line, ax.lines[0]) # Line2D(_line0)  Line2D(_line0)

既然Line2D實(shí)例被添加到了ax.lines列表中,那么我們也可以通過(guò)對(duì)列表進(jìn)行操作來(lái)移除該實(shí)例:

del ax.lines[0]
ax.lines.remove(line)

set_xlabel

Axes也可以來(lái)修飾坐標(biāo)軸减拭,比如添加坐標(biāo)軸的名稱:

xtext = ax.set_xlabel("my xdata")
ytext = ax.set_ylabel("my ydata")

當(dāng)我們使用set_xlabel的時(shí)候蔽豺,它將數(shù)據(jù)傳入XAxis的Text實(shí)例(每個(gè)Axes都有一個(gè)XAxis和YAxis實(shí)例)。

一個(gè)完整的例子


import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
fig.subplots_adjust(top=0.8)
ax1 = fig.add_subplot(211) #2row 1col 第一個(gè)plot
ax1.set_ylabel("volts")
ax1.set_title("a sin wave")

t = np.arange(0, 1, 0.01)
s = np.sin(2*np.pi*t)
line, = ax1.plot(t, s, color="blue", lw=2)

np.random.seed(10086)

ax2 = fig.add_axes([0.15, 0.1, 0.7, 0.3])
n, bins, patches = ax2.hist(np.random.randn(1000), 50,
                            facecolor="yellow", edgecolor="yellow")
ax2.set_xlabel('time (s)')

plt.show()
在這里插入圖片描述

定制你的對(duì)象

obj.set(alpha=0.5, zorder=2), obj.set_alpha(0.5)

我們可以通過(guò)obj.set(alpha=0.5, zorder=2)等以此設(shè)置多個(gè)屬性拧粪,也可以通過(guò)obj.set_alpha(0.5)設(shè)定alpha一個(gè)屬性修陡。

Artist實(shí)例有一系列屬性沧侥,通過(guò)對(duì)屬性的調(diào)整可以達(dá)到個(gè)性化的目的,下面是一個(gè)表:

在這里插入圖片描述

相關(guān)信息被存放在figure.patch和ax.patch中魄鸦,我們可以通過(guò)matplotlib.artist.getp()來(lái)查閱

matplotlib.artist.getp(), plt.getp()

通過(guò)下列語(yǔ)句都能獲得line的alpha屬性:

import matplotlib
plt.getp(line, "alpha")
plt.matplotlib.artist.getp(line, "alpha")

通過(guò)下列語(yǔ)句獲得全部屬性:

print(matplotlib.artist.getp(fig.patch)) #直接fig也可以啊宴杀,為什么一定要fig.patch?

agg_filter = None
alpha = None
animated = False
antialiased = False
bbox = Bbox(x0=0.0, y0=0.0, x1=1.0, y1=1.0)
capstyle = butt
children = []
clip_box = None
clip_on = True
clip_path = None
contains = None
data_transform = BboxTransformTo(     TransformedBbox(         Bbox...
edgecolor = (1.0, 1.0, 1.0, 1.0)
extents = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
facecolor = (1.0, 1.0, 1.0, 1.0)
figure = Figure(640x480)
fill = True
gid = None
hatch = None
height = 1
in_layout = True
joinstyle = miter
label = 
linestyle = solid
linewidth = 0.0
patch_transform = CompositeGenericTransform(     BboxTransformTo(   ...
path = Path(array([[0., 0.],        [1., 0.],        [1.,...
path_effects = []
picker = None
rasterized = None
sketch_params = None
snap = None
transform = CompositeGenericTransform(     CompositeGenericTra...
transformed_clip_path_and_affine = (None, None)
url = None
verts = [[  0.   0.]  [640.   0.]  [640. 480.]  [  0. 480....
visible = True
width = 1
window_extent = Bbox(x0=0.0, y0=0.0, x1=640.0, y1=480.0)
x = 0
xy = (0, 0)
y = 0
zorder = 1

None


也可以通過(guò)查閱某個(gè)對(duì)象的屬性:

print(matplotlib.artist.getp(line))

直接用

print(plt.getp(line))

也是可以的,雖然好像有一丟丟的不一樣拾因。

容器

正如我們之前提到的旺罢,Artist包括圖形元素和容器。容器和圖形元素有類似的屬性绢记,也有一些特別的 扁达,不如可以通過(guò)xscale屬性來(lái)控制x軸為線性的還是'log'的。這一節(jié)蠢熄,我們將回顧有關(guān)不同容器對(duì)象的一些方法跪解。

Figure container

最底層(top level)的容器便是figure對(duì)象,它包含一切在figure中的元素签孔。其背景為Rectangle,被存放在Figure.patch中叉讥。當(dāng)你通過(guò)add_subplot()或者add_axes()創(chuàng)建實(shí)例的時(shí)候,這些元素會(huì)被自動(dòng)添加到饥追,F(xiàn)igure.axes中图仓。


fig = plt.figure()
ax1 = fig.add_subplot(211)
ax2 = fig.add_axes([0.1, 0.2, 0.7, 0.3])

ax1
#<matplotlib.axes._subplots.AxesSubplot at 0x1e734b47f28>

ax2
#<matplotlib.axes._axes.Axes at 0x1e734de6908>

print(fig.axes)
#[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E734B47F28>, 
#<matplotlib.axes._axes.Axes object at 0x000001E734DE6908>]

我們可以通過(guò)fig.gca或者fig.sca來(lái)獲得當(dāng)前的axes,也可以通過(guò)delaxes()方法來(lái)移除但绕。

print(fig.gca()) # Axes(0.1, 0.2; 0.7x0.3)
plt.delaxes(ax2)
print(fig.gca()) # AxesSubplot(0.125,0.536818;0.775x0.343182)

圖片有用自己的text, lines, patches, images, 你可以直接往里面添加圖片元素救崔。
圖片坐標(biāo)(0, 0)代表左下角, (1壁熄,1)代表右上角帚豪?

import matplotlib.lines as lines

fig = plt.figure()

l1 = lines.Line2D([0, 1], [0, 1], transform=fig.transFigure, figure=fig)
l2 = lines.Line2D([0, 1], [1, 0], transform=fig.transFigure, figure=fig)
fig.lines.extend([l1, l2]) #extend是列表的方法

plt.show()
在這里插入圖片描述
在這里插入圖片描述

Axes container

Axes是matplotlib的重中之重,它包含了卻大多數(shù)的Artist草丧。和Figure一樣狸臣,它包含patch——Rectangle:笛卡爾坐標(biāo)和Circle:極坐標(biāo)。

fig = plt.figure()

ax = fig.add_subplot(211)
rect = ax.patch  # a Rectangle instance
rect.set_facecolor('green')
ax2 = fig.add_subplot(212, projection='polar')
cir = ax2.patch
cir.set_facecolor('yellow')
plt.show()
在這里插入圖片描述

當(dāng)你使用plotting method的時(shí)候昌执,比如plot()烛亦,傳入arrays,這個(gè)方法會(huì)創(chuàng)建了一個(gè)matplotlib.lines.Line2D()實(shí)例懂拾,并利用參數(shù)加以更新煤禽,然后將lines加入Axes.lines容器,并將他返回給你岖赋。

x, y = np.random.rand(2, 100)
line = ax.plot(x, y, "-", color="blue", linewidth=2)
在這里插入圖片描述
print(ax.lines)
# [<matplotlib.lines.Line2D object at 0x000002A965ED88D0>]

bar()檬果,hist()也有相似的功能,會(huì)添加patches到Axes.patches列表中。
下面的n表示每個(gè)柱patch的高度选脊,bins是指所在的位置杭抠,而rectangles是Rectangle實(shí)例列表。

n, bins, rectangles = ax.hist(np.random.randn(1000), 50, facecolor="yellow")
for item in rectangles[10:20]:
    item.set_facecolor("red")
    item.set_edgecolor((1.0, 1.0, 1.0, 1.0))

plt.show()
在這里插入圖片描述

一般情況下恳啥,請(qǐng)不要將之間向Axes.lines和Axes.patches中添加實(shí)例偏灿,除非你非常確定要這么做。因?yàn)槎鄣模谔砑訉?shí)例前翁垂,Axes會(huì)做一些額外的事情:它會(huì)設(shè)置一些屬性,檢查Artist中的數(shù)據(jù)硝桩,并自動(dòng)改變Axes的布局沿猜。我們可以通過(guò)add_line(),add_patch()來(lái)添加元素。

本來(lái)這里應(yīng)該有一個(gè)完整的實(shí)例的亿柑,但是obj.get_axes()函數(shù)被移除了邢疙,所以沒(méi)辦法了棍弄,貼一下方法:

在這里插入圖片描述
在這里插入圖片描述

Axis container

matplotlib.axis.Axis實(shí)例處理軸和網(wǎng)格線望薄,以及上面的標(biāo)記。


fig, ax = plt.subplots()
axis = ax.xaxis
print(axis.get_ticklocs())
print(axis.get_ticklabels())
print(axis.get_ticklines())
print(axis.get_ticklines(minor=True))
#[0.  0.2 0.4 0.6 0.8 1. ]
#<a list of 6 Text major ticklabel objects>
#<a list of 12 Line2D ticklines objects>
#<a list of 0 Line2D ticklines objects>

一個(gè)關(guān)于Axis的完整的例子(+常用的函數(shù))

# Here is a summary of some of the useful accessor methods of the ``Axis``
# (these have corresponding setters where useful, such as
# set_major_formatter)
#
# ======================  =========================================================
# Accessor method         Description
# ======================  =========================================================
# get_scale               The scale of the axis, e.g., 'log' or 'linear'
# get_view_interval       The interval instance of the axis view limits
# get_data_interval       The interval instance of the axis data limits
# get_gridlines           A list of grid lines for the Axis
# get_label               The axis label - a Text instance
# get_ticklabels          A list of Text instances - keyword minor=True|False
# get_ticklines           A list of Line2D instances - keyword minor=True|False
# get_ticklocs            A list of Tick locations - keyword minor=True|False
# get_major_locator       The matplotlib.ticker.Locator instance for major ticks
# get_major_formatter     The matplotlib.ticker.Formatter instance for major ticks
# get_minor_locator       The matplotlib.ticker.Locator instance for minor ticks
# get_minor_formatter     The matplotlib.ticker.Formatter instance for minor ticks
# get_major_ticks         A list of Tick instances for major ticks
# get_minor_ticks         A list of Tick instances for minor ticks
# grid                    Turn the grid on or off for the major or minor ticks
# ======================  =========================================================
#
# Here is an example, not recommended for its beauty, which customizes
# the axes and tick properties

# plt.figure creates a matplotlib.figure.Figure instance
fig = plt.figure()
rect = fig.patch  # a rectangle instance
rect.set_facecolor('lightgoldenrodyellow')

ax1 = fig.add_axes([0.1, 0.3, 0.4, 0.4])
rect = ax1.patch
rect.set_facecolor('lightslategray')

for label in ax1.xaxis.get_ticklabels():
    # label is a Text instance
    label.set_color('red')
    label.set_rotation(45)
    label.set_fontsize(16)

for line in ax1.yaxis.get_ticklines():
    # line is a Line2D instance
    line.set_color('green')
    line.set_markersize(25)
    line.set_markeredgewidth(3)

plt.show()
在這里插入圖片描述

Tick containers

Tick是最后的容器呼畸,包含了軸和網(wǎng)格線實(shí)例痕支。


在這里插入圖片描述

一個(gè)關(guān)于Tick的例子

# sphinx_gallery_thumbnail_number = 10
import numpy as np
import matplotlib.pyplot as plt


import matplotlib.ticker as ticker

# Fixing random state for reproducibility
np.random.seed(19680801)

fig, ax = plt.subplots()
ax.plot(100*np.random.rand(20))

formatter = ticker.FormatStrFormatter('$%1.2f')
ax.yaxis.set_major_formatter(formatter)

for tick in ax.yaxis.get_major_ticks():
    tick.label1On = True
    tick.label2On = True
    tick.label2.set_color('green')

plt.show()
在這里插入圖片描述

函數(shù)鏈接

add_axes()-添加axes
set_xlabel()-添加xlabel
matplotlib.artist.getp()-獲取屬性類似的plt.getp()
Rectangle-figure的背景
add_subplot()-添加subplot
fig.gca()-獲取當(dāng)前的axes
plt.delaxes(ax)-移除ax
ax.add_line()-添加line
ax.add_patches()-添加patches

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛮原,隨后出現(xiàn)的幾起案子卧须,更是在濱河造成了極大的恐慌,老刑警劉巖儒陨,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件花嘶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蹦漠,警方通過(guò)查閱死者的電腦和手機(jī)椭员,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)笛园,“玉大人隘击,你說(shuō)我怎么就攤上這事⊙忻” “怎么了埋同?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)棵红。 經(jīng)常有香客問(wèn)我凶赁,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任虱肄,我火速辦了婚禮楼熄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘浩峡。我一直安慰自己可岂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布翰灾。 她就那樣靜靜地躺著缕粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪纸淮。 梳的紋絲不亂的頭發(fā)上平斩,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音咽块,去河邊找鬼绘面。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侈沪,可吹牛的內(nèi)容都是我干的揭璃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亭罪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼瘦馍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起应役,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤情组,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后箩祥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體院崇,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年袍祖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了底瓣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盲泛,死狀恐怖濒持,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寺滚,我是刑警寧澤柑营,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站村视,受9級(jí)特大地震影響官套,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一奶赔、第九天 我趴在偏房一處隱蔽的房頂上張望惋嚎。 院中可真熱鬧,春花似錦站刑、人聲如沸另伍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)摆尝。三九已至,卻和暖如春因悲,著一層夾襖步出監(jiān)牢的瞬間堕汞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工晃琳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讯检,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓卫旱,卻偏偏與公主長(zhǎng)得像人灼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子誊涯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容