#!/usr/bin/env python
"""Image-colored wordcloud=======================You can color a word-cloud by using an image-based coloring strategyimplemented in ImageColorGenerator. It uses the average color of the regionoccupied by the word in a source image. You can combine this with masking -pure-white will be interpreted as 'don't occupy' by the WordCloud object whenpassed as mask.If you want white as a legal color, you can just pass a different image to"mask", but make sure the image shapes line up."""
from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator
d = path.dirname("__file__")
# Read the whole text.
text = open(path.join(d, 'amazon_publisher.txt')).read()
# read the mask / color image taken from
# http://jirkavinse.deviantart.com/art/quot-Real-Life-quot-Alice-282261010
# amazon_coloring = np.array(Image.open(path.join(d, "Picture1.png")))
# stopwords = set(STOPWORDS)
# stopwords.add("said")
icon = Image.open(path.join(d, "book6.jpeg")).convert("RGBA")
# change the size of canvas
mask = Image.new("RGB", icon.size, (1200,1200,1200))
mask.paste(icon,icon)
amazon_coloring = np.array(mask)
stopwords = set(STOPWORDS)
stopwords.add("said")
wc = WordCloud(background_color="white", max_words=2000, mask=amazon_coloring,
stopwords=stopwords, max_font_size=40, random_state=42)
# generate word cloud
wc.generate(text)
# create coloring from image
image_colors = ImageColorGenerator(amazon_coloring)
# show
plt.imshow(wc, interpolation="bilinear")
plt.axis("off")
plt.figure()
# recolor wordcloud and show
# we could also give color_func=image_colors directly in the constructor
plt.imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
plt.axis("off")
plt.figure()
plt.imshow(amazon_coloring, cmap=plt.cm.gray, interpolation="bilinear")
plt.axis("off")
plt.show()