已解決:餅圖各部分分離,詞語顏色自定義設置后再隨機
未解決:背景透明設置
注:數據來自存儲的數據庫
可視化案例

from random import randint
from jobspider.dao.PositionDao import PositionDao
from os import path
import matplotlib.pyplot as plot
import numpy as np
from matplotlib import colors
from wordcloud import WordCloud, ImageColorGenerator
from PIL import Image
from matplotlib.colors import ListedColormap
# 用來正常顯示中文標簽
plot.rcParams['font.sans-serif'] = ['SimHei']
# 用來正常顯示負號
plot.rcParams['axes.unicode_minus'] = False
# Matplotlib的圖像都位於Figure對象中。可以用plt.Figure創建一個新的Figure。
fig = plot.figure()
# 用add_subplot創建一個或多個subplot
# add_subplot(將畫布划分的行數,將畫布划分的行數,位置是按照從左往右,從上到下自動排列的數)
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 1, 2)
positionDao = PositionDao()
resultTypeSalary = positionDao.getPostionStaaticTypeSalary()
# print(resultTypeSalary) ((11935.70580446508, 'c/c++職位信息'), (11393.54413444911, 'java職位信息'), (11808.424901270604, 'python職位信息'), (16875.0, '人工智能職位信息'), (13790.123480902777, '大數據職位信息'))
# 推導式,取各元組的第一個元素
y = [y[0] for y in resultTypeSalary]
x = [x[1] for x in resultTypeSalary]
# print(x) ['c/c++職位信息', 'java職位信息', 'python職位信息', '人工智能職位信息', '大數據職位信息']
# print(y) [11935.70580446508, 11393.54413444911, 11808.424901270604, 16875.0, 13790.123480902777]
# 設置x軸的范圍
xAxis = list(range(len(x)))
# print(xAxis) [0, 1, 2, 3, 4]
# 設置y軸的范圍
# ax1.set_ylim([0, 140])
# x軸每個標簽的具體位置,設置為每個柱的中央
ax1.set_xticks(xAxis)
# x軸設置成職位值
ax1.set_xticklabels(x)
# x軸每個標簽的具體位置,設置為每個柱的中央
# x軸顯示中文
# plot.xticks(xAxis, x)
# 圖表名稱
ax1.set_title("職位薪資對比圖")
ax1.set_xlabel("職位")
ax1.set_ylabel("薪資(元)")
# 柱狀圖,顏色
# 創建柱狀圖bar(x橫軸,y縱軸,bar寬度[,描邊線透明])
bars = ax1.bar(xAxis, y, width=0.3)
z_colors = ['#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
for bar, color in zip(bars, z_colors):
bar.set_color(color)
pass
# 頂部顯示y值
for xx, yy in zip(xAxis, y):
ax1.text(xx, yy + 0.05, '%.0f(元)' % yy, ha='center', va='bottom')
# 不同職位數量對比的餅圖
resultTypeCount = positionDao.getPostionStaaticTypeCount()
print(resultTypeCount)
# x職位信息 y職位數量信息
xLabel = [x[1] for x in resultTypeCount]
yValue = [y[0] for y in resultTypeCount]
# 餅圖顏色
b_colors = ['#9287e7', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
# 算出比例
pg = [y / sum(yValue) * 100 for y in yValue]
# 使用推導式獲取每個部分的文字數據描述信息
labels = ['%s%.2f %% ' % (x, p) for x, p in zip(xLabel, pg)]
# 使用條件邏輯獲取java的的部分 有輸出距離0.0618 numpy
explode = np.where(np.array(xLabel) == 'java職位信息', 0.0618, 0)
# explode = np.where(np.array(xLabel) == 'python職位信息',0.0618, 0)
# explode[2] = explodePython[2]
# print(explode)
# 修改pie()方法添加想要添加的參數參數
ax2.pie(yValue, colors=b_colors, labels=labels, explode=explode)
# 標題
ax2.set_title("職位數量對比圖")
#詞雲
resultTypeCityCount = positionDao.getPostionStaaticTypeCityCount()
# print(resultTypeCityCount)
#每次取list的元組元素出來給city
city = [value[0] for value in resultTypeCityCount]
text =' '.join(city)
# print(text)
# 獲取當前腳本文件的絕對路徑
d = path.dirname(__file__)
# x.sort()
# print(x)
# 設置圖片
alice_mask = np.array(Image.open(path.join(d,"img/1.png")))
color_mask = np.array(Image.open(path.join(d,"img/2.jpg")))
# 設置圖片顏色
# image_colors = ImageColorGenerator(color_mask)
#自定義顏色列表
color_list=['#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c','#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c',
'#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c','#60acfc', '#32d3eb', '#5bc49f', '#feb64d', '#ff7c7c']
# 基於自定義顏色表構建colormap對象
colormap = colors.ListedColormap(color_list)
# 設置字體
font = r'C:\Windows\Fonts\SimHei.ttf'
wordcloud = WordCloud(background_color=None,
font_path=font,
max_font_size=300,
# height=4000, # 高度設置為400
#width=8000, # 寬度設置為800
colormap=colormap
,mask=alice_mask,
random_state=42,
prefer_horizontal=0.5)#詞語水平方向排版出現的頻率,默認 0.9 (所以詞語垂直方向排版出現頻率為 0.1 )
wordcloud.generate(text)
ax3.imshow(wordcloud, interpolation="bilinear")
ax3.set_title("IT熱門城市")
#取消圖表x、y軸
ax3.axis("off")
# 顯示
plot.show()