實際上,文本的邊框與單位不同,例如散點圖。如果調整窗口大小或更改比率,則文本是一種不同類型的對象,可以重新繪製。由於具有穩定的窗口,你可以問邊界框的座標情節單位,建立自己的彩色文本方式:
a = "all unicorns poop rainbows ! ! !".split()
c = ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black']
f = plt.figure(figsize=(4,3), dpi=120)
ax = f.add_subplot(111)
r = f.canvas.get_renderer()
space = 0.1
w = 0.5
counter = 0
for i in a:
t = ax.text(w, 1.2, a[counter],color=c[counter],fontsize=12,ha='left')
transf = ax.transData.inverted()
bb = t.get_window_extent(renderer=f.canvas.renderer)
bb = bb.transformed(transf)
w = w + bb.xmax-bb.xmin + space
counter = counter + 1
plt.ylim(0.5,2.5)
plt.xlim(0.6,1.6)
plt.show()
,這會導致:
![Matplotlib colored text](https://i.stack.imgur.com/DpGAR.png)
然而這,仍然不理想,因爲您需要控制繪圖軸的大小以獲取單詞之間的正確空格。這有點武斷,但如果你設法用這樣的控制來完成你的程序,使用繪圖單元來達到你的預期目的是可行的。
原貼:
plt.
只是調用庫。事實上,你正在全局範圍內創建一個plt.figure
的實例(所以它可以在本地的函數中看到)。由於這個原因,您將覆蓋figure
,因爲您爲該變量使用了相同的名稱(因此最終只有一個實例)。要解決此問題,請嘗試控制圖形實例的名稱。例如:
import matplotlib.pyplot as plt
#%matplotlib inline
from matplotlib import transforms
fig = plt.figure(figsize=(4,3), dpi=300)
#plt.show(fig)
def rainbow_text(x,y,ls,lc,**kw):
t = plt.gca().transData
figlocal = plt.gcf()
#horizontal version
for s,c in zip(ls,lc):
text = plt.text(x,y," "+s+" ",color=c, transform=t, **kw)
text.draw(figlocal.canvas.get_renderer())
ex = text.get_window_extent()
t = transforms.offset_copy(text._transform, x=ex.width, units='dots')
plt.show(figlocal) #plt.show((figlocal,fig))
#plt.figure()
rainbow_text(0.5,0.5,"all unicorns poop rainbows ! ! !".split(),
['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black'],
size=40,)
我評論的幾個指令,但請注意,我給了figure
本地的功能(figlocal
)不同的名稱。另外請注意,在我的節目示例中,我直接控制應該顯示哪個figure
。
至於你的其他問題,發現你可以使用其他單位可以在功能文檔中可以看出:
Return a new transform with an added offset.
args:
trans is any transform
kwargs:
fig is the current figure; it can be None if units are 'dots'
x, y give the offset
units is 'inches', 'points' or 'dots'
編輯:顯然有某種問題與邊框的文本,做的程度沒有給出正確的單詞寬度,因此單詞之間的空間不穩定。我的建議是使用Matplotlib的膠乳功能在相同的字符串中寫入顏色(因此只需調用一次plt.text)。你可以這樣做:
import matplotlib
import matplotlib.pyplot as plt
matplotlib.use('pgf')
from matplotlib import rc
rc('text',usetex=True)
rc('text.latex', preamble=r'\usepackage{color}')
a = "all unicorns poop rainbows ! ! !".split()
c = ['red', 'orange', 'brown', 'green', 'blue', 'purple', 'black']
st = ''
for i in range(len(a)):
st = st + r'\textcolor{'+c[i]+'}{'+a[i]+'}'
plt.text(0.5,0.5,st)
plt.show()
然而,這不是一個理想的解決方案。原因是你需要安裝Latex,包括必要的軟件包(注意我正在使用顏色軟件包)。看看Yann在這個問題上的回答:Partial coloring of text in matplotlib
謝謝,@armatita但如何控制(真,正規化)對於給定的單元的寬度?我問,因爲這些例子會產生不一致的單詞間距,這正是我最終想要解決的問題(關於我的問題的第二部分)。 –
@舞會派對2如果這種變換沒有做正確的方式,那麼就忘記變換。定義您的字體,對齊並使用座標繪製每個單詞。注意你已經獲得了文本的邊界框(text.get_window_extent()),所以你可以聲明一個空格,例如0.2表示word2應該放在word1_width + 0.2中(對於word3也是如此)將會自己建立一種轉變。事情是我不確定你正在使用的是什麼變化實際上在做。另外:http://stackoverflow.com/questions/5320205/matplotlib-text-dimensions – armatita
是的!非常感謝!這將節省我幾個小時的時間。如果你想發佈這個答案,我會很樂意接受它。 –