填写自己的mysql连接方式和sql语句即可实现饼图带百分比,线长度自己可以调参数
import pymysql
from matplotlib import pyplot as plt
import numpy as np
class mysql_func():
# 配置mysql数据库连接池
def init(self, host=’’, user=’’, password=’’, port=, database=’’,
charset=’’):
self.host = host
self.user = user
self.password = password
self.port = port
self.database = database
self.charset = charset
self.db = pymysql.connect(host=host, user=user, password=password, port=port, database=database,
charset=charset)
# 取数据,tuple类型返回
def get_data(self, sql):
self.curors = self.db.cursor()
self.curors.execute(sql)
self.db.commit()
data = self.curors.fetchall()
self.curors.close()
return data
# 存数据,int类型返回成功条数
def get_row_number(self, sql, data=None):
self.curors = self.db.cursor()
if data is None or len(data) == 0:
self.curors.execute(sql)
else:
if type(data[0]) != type([]):
data = [data]
self.curors.executemany(sql, data)
self.db.commit()
data = self.curors.rowcount
self.curors.close()
return data
# 取数据,[dict]类型返回
def get_json(self, sql):
self.curors = self.db.cursor()
self.curors.execute(sql)
self.db.commit()
columns = [col[0] for col in self.curors.description]
data = [dict(zip(columns, row)) for row in self.curors.fetchall()]
self.curors.close()
return data
def academic_co_country_img():
mysql_aliyun = mysql_func(host=’’, user=’’, password=’’, port=,
database=’’)
sql = ‘’’’’’
country_data = mysql_aliyun.get_data(sql)
print(country_data)
fig, ax = plt.subplots(figsize=(10, 6), subplot_kw=dict(aspect=“equal”))
size = 0.3
vals = np.array([[k[1],0] for k in country_data])
# print(vals.sum())
ingredients = [k[0] for k in country_data]
print(ingredients)
recipe = []
for k in country_data:
recipe.append(k[1]/vals.sum())
# recipe.append(format(k[1]/vals.sum(),’.1%’))
# print(recipe)
new_ingredients = []
for l in range(len(ingredients)):
new_ingredients.append(ingredients[l] + " " + str(format(recipe[l],’.1%’)))
print(new_ingredients)
new_data = []
qita_num = 0
data = [k[1] for k in country_data]
if len(data) >= 10:
for d in range(len(data)):
if d > 9:
new_data.append(data[d])
qita_num += data[d]
new_data.append(qita_num)
else:
new_data = data
print(new_data,"************************")
wedges, texts = ax.pie(data, wedgeprops=dict(width=0.3), startangle=-40)
ax.legend(new_ingredients, title="", loc="upper left", bbox_to_anchor=(1, 0, 0.5, 1), )
# 每一类别说明框
# boxstyle框的类型,fc填充颜色,ec边框颜色,lw边框宽度
bbox_props = dict(boxstyle="square,pad=0.3", fc='white', ec="white", lw=0.72)
# 设置框引出方式
kw = dict(arrowprops=dict(arrowstyle="-"),
bbox=bbox_props, zorder=0, va="center")
# 添加标签
ta = 1.4
for i, p in enumerate(wedges):
# if recipe[i] >= 0.03:
if i < 10:
ang = (p.theta2 - p.theta1) / 2. + p.theta1
y = np.sin(np.deg2rad(ang))
x = np.cos(np.deg2rad(ang))
# 设置方向
horizontalalignment = {-1: "right", 1: "left"}[int(np.sign(x))]
connectionstyle = "angle,angleA=0,angleB={}".format(ang)
kw["arrowprops"].update({"connectionstyle": connectionstyle})
#设置标注 这一步可以调整饼图的线
ax.annotate(format(recipe[i],'.1%'), xy=(x, y), xytext=(1.35 * np.sign(x), 1.4 * y),
horizontalalignment=horizontalalignment, color='black', **kw)
ta -= 0.3
ax.set_title(" ")
plt.show()
'''
cmap = plt.get_cmap("tab20c")
outer_colors = cmap(np.arange(3) * 4)
wedges = ax.pie(vals.sum(axis=1), wedgeprops=dict(width=0.5), startangle=-40, autopct='%.1f%%',radius=1, pctdistance=1.2, labeldistance=1.2)
ax.legend(ingredients, title="", loc="upper left", bbox_to_anchor=(1, 0, 0.5, 1),)
ax.set(aspect="equal", title='')
plt.show()
'''
if name == ‘main’:
academic_co_country_img()