win7+python3.6+word_cloud 安裝出現Microsoft Visual C++ 14.0 is required

說明

環境:python

已安裝Anaconda3 (64-bit) 4.4.0Python 3.6.1)。其中,代碼調試在Spyder 3.1.4中進行,安裝包則直接打開Anaconda Prompt調用cmd.exe後進行。git

系統爲Windows 7 和 Windows 10。github


安裝包的坑

安裝文件的獲取

首先,安裝包時,直接用 pip install wordcloud是會報錯的,會有文件缺失的問題。這一點很多人都有相似反饋。express

解決方案:canvas

github下載wordcloud的包,解壓縮後,在對應目錄下用python setup.py install安裝。markdown

VC++ 14的缺失問題

安裝wordcloud時出現報錯信息:網絡

error: Microsoft Visual C++ 14.0 is required. Get it with 「Microsoft Visual C++ Build Tools」: http://landinghub.visualstudio.com/visual-cpp-build-toolsapp

這種狀況下,其實直接跟着提示內容進行就好。less

解決方案:dom

打開報錯提示中的連接,下載並安裝Visual C++ 2015 Build Tools

這個問題,我在一臺電腦上這樣解決(成功安裝了wordcloud包並正常調試了相關Python代碼)以後,嘗試在另外一臺電腦上再安裝該包,結果出現了新問題:Visual C++ 2015 Build Tools,從官網下載下來的安裝程序visualcppbuildtools_full.exe,打開後在安裝過程當中須要聯網獲取文件,可是因爲網絡限制致使沒法獲取,因而沒法安裝!而且沒有搜到含有完整安裝文件的包。(注:該電腦所處的網絡環境不同,通常網頁中的文件下載沒問題,可是build tools安裝時聯網獲取文件就受限制而不成功。)

離線安裝VC++14.0 build tools的解決方案:

  • 在能正常經過visualcppbuildtools_full.exe 聯網獲取安裝文件的電腦上,在系統自帶的cmd.exe中在對應目錄下執行:
visualcppbuildtools_full.exe /layout
  • 1

以後,選擇下載目錄存放離線安裝包,而後就能夠把安裝文件下載下來了。

  • 而後在不能聯網安裝的電腦上,安裝離線包便可。

此處是參考msdn上找到的方法。

其它嘗試

當遇到安裝Visual C++ 2015 Build Tools沒法獲取安裝文件時(visualcppbuildtools_full.exe 只有3M,卻提示默認安裝的話須要4G空間,可想而知須要下載很多安裝文件,實際上最後下載的安裝文件也有2G左右),曾經嘗試過是否能夠不安裝4G這麼大的build tools而只安裝VC++14的運行庫,畢竟應該只是缺庫吧?

畢竟,實際上運行庫Microsoft Visual C++ 2015 Redistributable Update 3下載連接在此)的安裝程序只有十幾M大小,而且可以正常下載安裝。

但我試下來的結果是,安裝了這個東西之後依然會有前面同樣的報錯。因此仍是繼續老老實實下載了完整的build tools。若是你有更好的方案(不用安裝這個佔4G左右的你們夥,不用藉助另外一個網絡環境下的電腦),能夠和我留言。

備註

github下載到的原wordcloud安裝包中,提到若是安裝仍是有問題的的話能夠試試安裝連接中的.whl文件。

不過,我是沒下載這個.whl文件的,前面講到的坑補完就行了。


字體的坑

Win10和Win7的默認字體後綴居然不同

生成雲詞圖的過程當中,本身設置字體爲「微軟雅黑 粗體」,在系統(Win10)路徑中找到了這個字體的路徑「C:\Windows\Fonts\msyhbd.ttc」

沒想到,代碼複製到第二臺電腦(Win7)下執行時卻報錯。原本覺得都是Windows默認庫裏的字體應該沒什麼問題,打開一看才發現Win7這裏的字體後綴是「ttf」

改過就正常了。

提醒之後注意:

哪怕是Windows上執行過沒問題的代碼,換個一樣Windows的電腦,也要注意 系統默認路徑和相關文件 是否有變化!

並非全默認就都同樣啊啊啊啊!!!


遮罩底圖的坑

錯誤提示Gray-scale?

NotImplementedError: Gray-scale images TODO
  • 1

一開始,我用的底圖會出現如上報錯。

若是把出錯的以下這行

plt.imshow(my_wc.recolor(color_func=i_colors))
  • 1

去掉,那麼就不會報錯,可是生成的雲詞圖會只有形狀、沒有原圖的顏色。

出現報錯時用的底圖以下: 
用這個圖會報錯

這個圖片有什麼問題呢?爲何會有「Gray-scale images」這種提示,難道我這個圖的灰度有問題?明明好幾個顏色啊好嗎?甚至我專心弄了個純黑白的圖,發現純黑白色底圖都能正常執行代碼。

不過,把上面出錯的圖,和兩個不出錯的圖對比一下讀取後的數據,就能看出問題在哪裏了。

以下圖所示:

coloring0=np.array(Image.open("出錯圖.png")) #問題圖,實際上,下面的白底「底圖1」就是將該圖直接截圖保存生成的 coloring1=np.array(Image.open("後面附上不一樣背景測試圖對比的底圖1.bmp")) #白底 coloring2=np.array(Image.open("後面附上不一樣背景測試圖對比的底圖2.png")) #透明底
  • 1
  • 2
  • 3

coloring0是出錯的圖

覈查報錯位置源代碼:

class ImageColorGenerator(object): ......#此處省略不少代碼 def __call__(self, word, font_size, font_path, position, orientation, **kwargs): ......#此處省略不少代碼 if patch.ndim == 2: raise NotImplementedError("Gray-scale images TODO") ......#此處省略不少代碼
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

這就能夠肯定這個報錯只因 「維度爲2」 引發的。

哦,終於明白這個「Gray-scale」是什麼鬼了。這貨,每一個點都只有2個值來代表顏色啊。後面白底的圖,沒有透明色,每一個點也是正常的3個值;透明底的圖,多了第4個值來表示透明度。而這個「沒有Gray-scale的圖」,應該就是沒有灰度參數吧?以前選圖時候還真沒注意這點,畢竟我也不是學美術出身,乍一眼也看不出來這個圖的顏色沒有灰度因此有可能沒有灰度參數啊。

解決方案:

對於新手小白,若是不想在讀取圖像後直接改Value加一列的話,最簡單的操做就是換個能用的圖再執行吧。

若是肯定就是隻要這個圖的樣子,那麼能夠轉化格式,或者再不行截個圖保存再用也是能夠的。

總之,這個報錯的緣由,不是代碼問題,僅僅是圖的格式問題


圖片輸出的坑

圖片沒有正常顯示 新手關於plt.savefig的用法

這裏我用plt.savefig("這裏是生成圖片的路徑")來存儲生成的雲詞圖。

一開始,將plt.savefig放在plt.show以後,結果只是生成了空白的圖。後來在這篇文章《【Python】解決使用plt.savefig保存圖片時一片空白》中瞭解到:

「在plt.show() 後實際上已經建立了一個新的空白的圖片(座標軸),這時候你再plt.savefig() 就會保存這個新生成的空白圖片。」

因此,只要把plt.savefig放在plt.show以前便可解決這個問題。

我生成雲詞圖的最後幾行代碼以下:

plt.imshow(my_wc)
plt.axis("off") plt.savefig("H:/temp/temp.jpg",dpi=200) #用反斜槓的話會報錯 plt.show()
  • 1
  • 2
  • 3
  • 4

另外一種輸出圖像的方式 .to_file

WordCloud中,自帶.to_file能夠將雲詞圖輸出到文件。

具體方法:將上述代碼中plt.savefig一行替換爲

my_wc.to_file("H:/temp/temp.jpg")
  • 1

便可。

能夠發現兩種輸出方式的區別: 
plt.savefig默認尺寸是和終端中顯示差很少的縮略版的圖(大小432×288),能夠經過dpi調節精度改善清晰度,具體可見本文中「圖片大小和精度的影響」的描述。 
.to_file,則輸出的是每一個字都精確顯示的完整雲詞圖,很是清晰,放大後能夠看到連最小的字都是清晰完整地顯示,固然默認尺寸也很大。

爲方便對比,可見本文後面WordCloud參數的調節這部分裏scale=2(使用plt.savefig輸出,dpi=200)、scale=32(使用plt.savefig輸出,dpi=200)、scale=2(使用.to_file輸出)的3個雲詞圖。

生成圖像清晰度的調節

圖片大小和精度的影響

由於此次用plt.savefig默認生成的圖感受不是很清晰,尺寸不夠大,因此這裏在plt.savefig中加上了參數dpi調整精度。

固然,一樣一張圖,精度越高,天然尺寸也是越大的。

不過,至於精度調整成多少合適(只爲了肉眼看起來清晰),是看狀況而定。雖然理論上精度越大就越清晰,可是在遮罩圖、詞數量等因素肯定的狀況下,有時候更大的精度只是把圖的尺寸放大,但肉眼可見的清晰程度並不會真的就提升。

若是圖過小太密集,那麼多是默認精度的侷限致使不清晰。須要調整精度參數dpi放大圖片。

可是若是圖片足夠大,字看起來也不小,可是仍然不清晰,或者佈局不天然,那麼有多是雲詞圖生成時自己的參數設置問題。可見下面的描述。

WordCloud參數的調節

import matplotlib.pyplot as plt from wordcloud import WordCloud,ImageColorGenerator import numpy as np import PIL.Image as Image coloring=np.array(Image.open("H:\temp\meerca_2.png")) my_wc=WordCloud(background_color="white",max_words=2000, mask=coloring, max_font_size=60,random_state=42,scale=8, font_path="C:\Windows\Fonts\msyhbd.ttf").generate(word_space_split) #這裏word_space_split是前面生成的以空格分割的須要生成雲詞的詞庫字符串(str)

這裏簡要講下幾個會影響圖像清晰問題的WordCloud的參數:

  • mask遮罩圖,字的大小布局和顏色都會依據遮罩圖生成。其實理論上這對字大小和清晰程度的影響不大,可是遮罩圖色和背景色background_color若是易混淆,則多是一個致使看起來不清晰的因素;另外遮罩圖自身各個顏色之間的對比不強烈,也可能使圖看起來層次感不夠。

    • 好比,一些圖明度比較高,再加上背景白色,有可能致使字色太淺(背景色background_color又是白色)因而看起來不夠「清晰」。
  • background_color背景色,默認。這個原本其實也不怎麼影響清晰度,可是,就像以前在mask中提到的,若是遮罩圖像顏色過淺、背景設置白色,可能致使字看起來「不清晰」。而實際上,我對一個淺色遮罩圖分別用白、黑兩種背景色後發現,黑色背景的強烈對比之下會有若干很淺也很小的詞浮現出來,而以前因背景色、字色過於相近而幾乎沒法用肉眼看出這些詞

  • mode:默認「RGB」。根聽說明文檔,若是想設置透明底色的雲詞圖,那麼能夠設置background_color=None, mode="RGBA" 
    • 可是!!!實際中我嘗試設置透明背景色並無成功過! 
      • 當我選取的遮罩圖是白色底時,若是background_color設置爲"white""black"時,生成的雲詞確實是對應的「白色」「黑色」;可是按照上述參數設置透明色時,結果出來依然是白色
      • 當我選取的遮罩圖是透明底時,那麼無論我background_color設置爲"white""black",仍是None加上mode="RGBA",結果都是把背景部分當作黑色圖塊,自動匹配黑色的字!——也就是並無實現透明底的雲詞。
      • 誰若是實現了透明底色的方案,歡迎給我留言。目前這個疑惑我打算先不研究了,放到之後再看。

底圖1(白底,640×435): 
底圖1(白底,640×435) 
底圖2(透明底,300×300): 
底圖2(透明底,300×300) 
底圖1與底圖2生成雲詞圖效果對比,除background_colormode參數之外其它參數不變: 
白底和透明底圖,配不一樣的background_color和mode參數對比
注:1. 兩個底圖尺寸也有點區別。生成的圖片是用plt.savefig(參數dpi=200),也能夠看出生成圖在佈局上有差別。2. 本文中,其它雲詞圖實例中,均是使用「底圖1」(自己是白色底)這個圖。

  • max_font_size最大字號。源文件中也有講到,圖的生成會依據最大字號等因素去自動判斷詞的佈局。經測試,哪怕同一個圖像,只要圖自己尺寸不同(好比我把一個300×300的圖拉大到600×600再去當遮罩),那麼一樣的字號也是會有不一樣的效果。原理想一想也很天然,字號決定了字的尺寸,而圖的尺寸變了之後,最大字相對於圖的尺寸比例天然就變了。因此,須要根據指望顯示的效果,去調整最大字號參數值。 
    • 相對應的參數min_font_size最小字號。不設置的狀況下,默認是4。嘗試了設置比4大的字號,例如八、10,結果就是本來小於設定值且大於4號的詞都直接不顯示了,其它內容和未設置該值時都同樣
  • relative_scaling:表示詞頻和雲詞圖中字大小的關係參數,默認0.5。爲0時,表示只考慮詞排序,而不考慮詞頻數;爲1時,表示兩倍詞頻的詞也會用兩倍字號顯示。本文中的案例,均用的默認值,未特別設置該參數。
  • scale:根聽說明文檔,當雲詞圖很大的,加大該值會比使用更大的圖更快,但值越高也會越慢(計算更復雜)。默認值是1。實際測試中,更大的值,確實輸出圖像看起來更精細(較小較淺的詞會顏色更重,也感受清楚,大的詞差別不明顯)。不過,可能因爲我選的圖不大、詞也沒有不少,因此差距並無很大,縮小排列一下就基本上辨別不出多少差異了。 
    • 經測試發現,在詞沒有不少(這裏len(word_space_split)=6310)和圖沒有很大的狀況下,詞不變,圖不變,則scale越大,運行速度越慢。實際上,本案例中取「32」時已經比「2」慢了不少秒,這個時間差能夠體會體會到,本文暫不對時間差和效率問題進行精確研究了。
    • 另外經測試發現,其它參數徹底相同狀況下,scale越大,圖片佔空間越小。這裏scale分別取「2」「10」「32」時,得到的圖片大小分別爲207K、110K、75.8K。(這裏圖用plt.savefig輸出,dpi=200,實際輸出尺寸爲1200×800。)
    • 下面選取底圖1時scale分別取「2」「10」「32」的縮略效果(其實我還試了「64」,可是一跑代碼電腦就卡了,卡到別的進程都沒法切到的程度,若干分鐘後實在等不了了強制結束,卡到Crtl+C都不反應、只能強制從任務管理器結束進程並且按了好久纔有反應,呵呵噠):

scale=2, scale=10, scale=32 對比
是否是沒看出什麼區別?那麼下面放下「2」「32」對應的雲詞圖自己。

scale=2的雲詞圖以下(使用plt.savefig輸出,dpi=200): 
scale=2

scale=32的雲詞圖以下(使用plt.savefig輸出,dpi=200): 
scale=32

scale=2的雲詞圖以下(使用.to_file輸出): 
用.to_file輸出

注:能夠注意上面3個圖中,右上方「惟有」字樣的右上角「如同」字樣(較小字)的顯示差別,進行對比。

  • random_state:不一樣的值會讓字圖的分佈不同。

不一樣random_state的效果對比

*注:本文的雲詞圖案例中,詞庫裏「1f60a」之類的字符沒有去掉,這些原本是表明某些emoji的。我我的以爲這不算亂碼吧,因此留着了。 
1f60a

  • 更多參數的設置,可參看源文件中的說明

*附上源文件wordcloud.py中對WordCloud這一函數的各個參數的解釋:

Word cloud object for generating and drawing. Parameters ---------- font_path : string Font path to the font that will be used (OTF or TTF). Defaults to DroidSansMono path on a Linux machine. If you are on another OS or don't have this font, you need to adjust this path. width : int (default=400) Width of the canvas. height : int (default=200) Height of the canvas. prefer_horizontal : float (default=0.90) The ratio of times to try horizontal fitting as opposed to vertical. If prefer_horizontal < 1, the algorithm will try rotating the word if it doesn't fit. (There is currently no built-in way to get only vertical words.) mask : nd-array or None (default=None) If not None, gives a binary mask on where to draw words. If mask is not None, width and height will be ignored and the shape of mask will be used instead. All white (#FF or #FFFFFF) entries will be considerd "masked out" while other entries will be free to draw on. [This changed in the most recent version!] scale : float (default=1) Scaling between computation and drawing. For large word-cloud images, using scale instead of larger canvas size is significantly faster, but might lead to a coarser fit for the words. min_font_size : int (default=4) Smallest font size to use. Will stop when there is no more room in this size. font_step : int (default=1) Step size for the font. font_step > 1 might speed up computation but give a worse fit. max_words : number (default=200) The maximum number of words. stopwords : set of strings or None The words that will be eliminated. If None, the build-in STOPWORDS list will be used. background_color : color value (default="black") Background color for the word cloud image. max_font_size : int or None (default=None) Maximum font size for the largest word. If None, height of the image is used. mode : string (default="RGB") Transparent background will be generated when mode is "RGBA" and background_color is None. relative_scaling : float (default=.5) Importance of relative word frequencies for font-size. With relative_scaling=0, only word-ranks are considered. With relative_scaling=1, a word that is twice as frequent will have twice the size. If you want to consider the word frequencies and not only their rank, relative_scaling around .5 often looks good. .. versionchanged: 2.0 Default is now 0.5. color_func : callable, default=None Callable with parameters word, font_size, position, orientation, font_path, random_state that returns a PIL color for each word. Overwrites "colormap". See colormap for specifying a matplotlib colormap instead. regexp : string or None (optional) Regular expression to split the input text into tokens in process_text. If None is specified, ``r"\w[\w']+"`` is used. collocations : bool, default=True Whether to include collocations (bigrams) of two words. .. versionadded: 2.0 colormap : string or matplotlib colormap, default="viridis" Matplotlib colormap to randomly draw colors from for each word. Ignored if "color_func" is specified. .. versionadded: 2.0 normalize_plurals : bool, default=True Whether to remove trailing 's' from words. If True and a word appears with and without a trailing 's', the one with trailing 's' is removed and its counts are added to the version without trailing 's' -- unless the word ends with 'ss'. Attributes ---------- ``words_`` : dict of string to float Word tokens with associated frequency. .. versionchanged: 2.0 ``words_`` is now a dictionary ``layout_`` : list of tuples (string, int, (int, int), int, color)) Encodes the fitted word cloud. Encodes for each word the string, font size, position, orientation and color. Notes ----- Larger canvases with make the code significantly slower. If you need a large word cloud, try a lower canvas size, and set the scale parameter. The algorithm might give more weight to the ranking of the words than their actual frequencies, depending on the ``max_font_size`` and the scaling heuristic.

https://github.com/amueller/word_cloud/

zhuan :http://blog.csdn.net/heyuexianzi/article/details/76851377?locationNum=6&fps=1

相關文章
相關標籤/搜索