Table of Contents

1  官方Demo

2  将实际数据应用于官方Demo

3  一些改善措施

3.1  重新设置字体大小

3.2  设置显示颜色,Method 1:

3.3  设置显示颜色, Method 2:

3.4  设置图例(legend)

3.5  重新设置图例(legend)

3.6  将某些类别突出显示


前言

matplotlib, 官方提供的饼图Demo,功能比较比较简单,在实际应用过程中,往往会有许多个性化的绘制需求,在这里跟大家一起了解下饼图(pie chart)的一些特色的功能的实现。

from matplotlib import font_manager as fmimport matplotlib as mplimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt% matplotlib inlineplt.style.use('ggplot')

1. 官方Demo

import matplotlib.pyplot as plt# Pie chart, where the slices will be ordered and plotted counter-clockwise:labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'sizes = [15, 30, 45, 10]explode = (0, 0.1, 0, 0)  # only "explode" the 2nd slice (i.e. 'Hogs')fig1, ax1 = plt.subplots()ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%',        shadow=True, startangle=90)ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.plt.savefig('Demo_official.jpg')plt.show()

2. 将实际数据应用于官方Demo

# 原始数据shapes = ['Cross', 'Cone', 'Egg', 'Teardrop', 'Chevron', 'Diamond', 'Cylinder',       'Rectangle', 'Flash', 'Cigar', 'Changing', 'Formation', 'Oval', 'Disk',       'Sphere', 'Fireball', 'Triangle', 'Circle', 'Light']values = [  287,   383,   842,   866,  1187,  1405,  1495,  1620,  1717,        2313,  2378,  3070,  4332,  5841,  6482,  7785,  9358,  9818, 20254]s = pd.Series(values, index=shapes)s
from matplotlib import font_manager as fmimport matplotlib as mpl# Pie chart, where the slices will be ordered and plotted counter-clockwise:labels = s.indexsizes = s.valuesexplode = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig1, ax1 = plt.subplots()patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170)ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.plt.savefig('Demo_project.jpg')plt.show()

上图的一些问题:

  1. 颜色比较生硬

  2. 部分文字拥挤在一起,绘图显示不齐整

3. 一些改善措施

  • 重新设置字体大小

  • 设置自选颜色

  • 设置图例

  • 将某些类别突出显示

3.1 重新设置字体大小

from matplotlib import font_manager as fmimport matplotlib as mpllabels = s.indexsizes = s.valuesexplode = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig1, ax1 = plt.subplots()patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170)ax1.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.# 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,# 'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)plt.savefig('Demo_project_set_font.jpg')plt.show()

3.2 设置显示颜色,Method 1:

from matplotlib import font_manager as fmimport matplotlib as mpl# Pie chart, where the slices will be ordered and plotted counter-clockwise:labels = s.indexsizes = s.valuesexplode = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig1, ax1 = plt.subplots(figsize=(6,6)) # 设置绘图区域大小a = np.random.rand(1,19)color_vals = list(a[0])my_norm = mpl.colors.Normalize(-1, 1) # 将颜色数据的范围设置为 [0, 1]my_cmap = mpl.cm.get_cmap('rainbow', len(color_vals)) # 可选择合适的colormap,如:'rainbow'patches, texts, autotexts = ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170, colors=my_cmap(my_norm(color_vals)))ax1.axis('equal')  # 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)plt.savefig('Demo_project_set_color_1.jpg')plt.show()

上面这种方法设置颜色时,但类别比较多时,部分颜色的填充会重复。

有时候,我们可能想设置成连续的颜色,可以有另外一种方法来实现。

3.3 设置显示颜色, Method 2:

from matplotlib import font_manager as fmfrom  matplotlib import cmlabels = s.indexsizes = s.values# explode = (0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig, ax = plt.subplots(figsize=(6,6)) # 设置绘图区域大小colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darkspatches, texts, autotexts = ax.pie(sizes, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170, colors=colors)ax.axis('equal')  ax.set_title('Shapes -------------------', loc='left')# 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)plt.savefig('Demo_project_set_color_2.jpg')plt.show()

从上图可以看出,颜色显示是连续的,实现了我们想要的效果

3.4 设置图例(legend)

from matplotlib import font_manager as fmfrom  matplotlib import cmlabels = s.indexsizes = s.values# explode = (0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig, ax = plt.subplots(figsize=(6,6)) # 设置绘图区域大小colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darkspatches, texts, autotexts = ax.pie(sizes, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170, colors=colors)ax.axis('equal')  # 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)ax.legend(labels, loc=2)plt.savefig('Demo_project_set_legend_error.jpg')plt.show()

从上面可看出,当类别较多时,图例(legend)的位置摆放显示有重叠,显示有些问题,需要进行调整。

3.5 重新设置图例(legend)

from matplotlib import font_manager as fmfrom  matplotlib import cmlabels = s.indexsizes = s.values# explode = (0.2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)  # only "explode" the 1st slicefig, axes = plt.subplots(figsize=(10,5),ncols=2) # 设置绘图区域大小ax1, ax2 = axes.ravel()colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darkspatches, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.0f%%',        shadow=False, startangle=170, colors=colors)ax1.axis('equal')  # 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)ax1.set_title('Shapes', loc='center')# ax2 只显示图例(legend)ax2.axis('off')ax2.legend(patches, labels, loc='center left')plt.tight_layout()plt.savefig('Demo_project_set_legend_good.jpg')plt.show()

3.6 将某些类别突出显示

  • 将某些类别突出显示

  • 控制label的显示位置

  • 控制百分比的显示位置

  • 控制突出位置的大小

from matplotlib import font_manager as fmfrom  matplotlib import cmlabels = s.indexsizes = s.valuesexplode = (0.1,0,0,0,0,0,0,0,0,0,0,0,0,0.2,0,0,0,0.1,0)  # "explode" , show the selected slicefig, axes = plt.subplots(figsize=(8,5),ncols=2) # 设置绘图区域大小ax1, ax2 = axes.ravel()colors = cm.rainbow(np.arange(len(sizes))/len(sizes)) # colormaps: Paired, autumn, rainbow, gray,spring,Darkspatches, texts, autotexts = ax1.pie(sizes, labels=labels, autopct='%1.0f%%',explode=explode,        shadow=False, startangle=170, colors=colors, labeldistance=1.2,pctdistance=1.03, radius=0.4)# labeldistance: 控制labels显示的位置# pctdistance: 控制百分比显示的位置# radius: 控制切片突出的距离ax1.axis('equal')  # 重新设置字体大小proptease = fm.FontProperties()proptease.set_size('xx-small')# font size include: ‘xx-small’,x-small’,'small’,'medium’,‘large’,‘x-large’,‘xx-large’ or number, e.g. '12'plt.setp(autotexts, fontproperties=proptease)plt.setp(texts, fontproperties=proptease)ax1.set_title('Shapes', loc='center')# ax2 只显示图例(legend)ax2.axis('off')ax2.legend(patches, labels, loc='center left')plt.tight_layout()# plt.savefig("pie_shape_ufo.png", bbox_inches='tight')plt.savefig('Demo_project_final.jpg')plt.show()

--- End ---


 赞赏、点赞、转发、AD支持是一种认可,如需获取本文源代码,请在公众号【Python数据之道】后台回复 “code” ,谢谢大家支持。

大量粉丝还没有养成阅读后转发的习惯,希望大家在阅读后顺便转发,以示鼓励!长期坚持原创真的很不容易,坚持是一种信仰,专注是一种态度!



©著作权归作者所有:来自51CTO博客作者mb5fe18e7c44408的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 如何使用带有“IF”条件的按钮改变DIV的背景颜色
  2. 如何使用jQuery增加字体大小的变化?
  3. 更改所选文本的背景颜色,HTML JQUERY
  4. HTML新手求解。关于CSS对于li标签的active状态的背景颜色
  5. HTML5中canvas实现矩形颜色渐变
  6. IE8:Div悬停仅在设置背景颜色时有效,非常奇怪,为什么?
  7. css字体大小在苹果邮件中比gmail (iphone)要小
  8. 如何控制html代码中DL标签的颜色?
  9. 有没有办法从指定的网站找到某种颜色的图像?

随机推荐

  1. 【方案汇总】BroadcastReceiver静态内部
  2. android gen文件不生成、R文件报错
  3. Android开发教程大全介绍
  4. Android的多线程限制
  5. Android,似乎没那么友好......
  6. android4.0 添加一个新的android 键值
  7. Android编译系统分析大全
  8. Android 下面的一些命令
  9. Android安装和环境搭建
  10. 2019最新Android常用开源库总结(附带githu