python绘图练习
1 turtle绘制奥运五环图 import turtle as p def drawCircle(x,y,c='red'): p.pu()# 抬起画笔 p.goto(x,y) # 绘制圆的起始位置 p.pd()# 放下画笔 p.color(c)# 绘制c色圆环 p.circle(30,360) #绘制圆:半径,角度 p.pensize(3) # 画笔尺寸设置3 drawCircle(0,0,'blue') drawCircle(60,0,'black') drawCircle(120,0,'red') drawCircle(90,-30,'green') drawCircle(30,-30,'yellow') p.done() 2.turtle绘制漫天雪花 import turtle as p import random def snow(snow_count): p.hideturtle() p.speed(500) p.pensize(2) for i in range(snow_count): r = random.random() g = random.random() b = random.random() p.pencolor(r, g, b) p.pu() p.goto(random.randint(-350, 350), random.randint(1, 270)) p.pd() dens = random.randint(8, 12) snowsize = random.randint(10, 14) for _ in range(dens): p.forward(snowsize) # 向当前画笔方向移动snowsize像素长度 p.backward(snowsize) # 向当前画笔相反方向移动snowsize像素长度 p.right(360 / dens) # 顺时针移动360 / dens度 def ground(ground_line_count): p.hideturtle() p.speed(500) for i in range(ground_line_count): p.pensize(random.randint(5, 10)) x = random.randint(-400, 350) y = random.randint(-280, -1) r = -y / 280 g = -y / 280 b = -y / 280 p.pencolor(r, g, b) p.penup() # 抬起画笔 p.goto(x, y) # 让画笔移动到此位置 p.pendown() # 放下画笔 p.forward(random.randint(40, 100)) # 眼当前画笔方向向前移动40~100距离 def main(): p.setup(800, 600, 0, 0) # p.tracer(False) p.bgcolor("black") snow(30) ground(30) # p.tracer(True) p.mainloop() main() 3 wordcloud词云图 import hashlib import pandas as pd from wordcloud import WordCloud geo_data=pd.read_excel(r"../data/geo_data.xlsx") print(geo_data) # 0 深圳 # 1 深圳 # 2 深圳 # 3 深圳 # 4 深圳 # 5 深圳 # 6 深圳 # 7 广州 # 8 广州 # 9 广州 words = ','.join(x for x in geo_data['city'] if x != []) #筛选出非空列表值 wc = WordCloud( background_color="green", #背景颜色"green"绿色 max_words=100, #显示最大词数 font_path='./fonts/simhei.ttf', #显示中文 min_font_size=5, max_font_size=100, width=500 #图幅宽度 ) x = wc.generate(words) x.to_file('../data/geo_data.png') 4 plotly画柱状图和折线图 #柱状图+折线图 import plotly.graph_objects as go fig = go.Figure() fig.add_trace( go.Scatter( x=[0, 1, 2, 3, 4, 5], y=[1.5, 1, 1.3, 0.7, 0.8, 0.9] )) fig.add_trace( go.Bar( x=[0, 1, 2, 3, 4, 5], y=[2, 0.5, 0.7, -1.2, 0.3, 0.4] )) fig.show() 5 seaborn热力图 # 导入库 import seaborn as sns import pandas as pd import numpy as np import matplotlib.pyplot as plt # 生成数据集 data = np.random.random((6,6)) np.fill_diagonal(data,np.ones(6)) features = ["prop1","prop2","prop3","prop4","prop5", "prop6"] data = pd.DataFrame(data, index = features, columns=features) print(data) # 绘制热力图 heatmap_plot = sns.heatmap(data, center=0, cmap='gist_rainbow') plt.show() 6 matplotlib折线图 模块名称:example_utils.py,里面包括三个函数,各自功能如下: import matplotlib.pyplot as plt # 创建画图fig和axes def setup_axes(): fig, axes = plt.subplots(ncols=3, figsize=(6.5,3)) for ax in fig.axes: ax.set(xticks=[], yticks=[]) fig.subplots_adjust(wspace=0, left=0, right=0.93) return fig, axes # 图片标题 def title(fig, text, y=0.9): fig.suptitle(text, size=14, y=y, weight='semibold', x=0.98, ha='right', bbox=dict(boxstyle='round', fc='floralwhite', ec='#8B7E66', lw=2)) # 为数据添加文本注释 def label(ax, text, y=0): ax.annotate(text, xy=(0.5, 0.00), xycoords='axes fraction', ha='center', style='italic', bbox=dict(boxstyle='round', facecolor='floralwhite', ec='#8B7E66')) import numpy as np import matplotlib.pyplot as plt import example_utils x = np.linspace(0, 10, 100) fig, axes = example_utils.setup_axes() for ax in axes: ax.margins(y=0.10) # 子图1 默认plot多条线,颜色系统分配 for i in range(1, 6): axes[0].plot(x, i * x) # 子图2 展示线的不同linestyle for i, ls in enumerate(['-', '--', ':', '-.']): axes[1].plot(x, np.cos(x) + i, linestyle=ls) # 子图3 展示线的不同linestyle和marker for i, (ls, mk) in enumerate(zip(['', '-', ':'], ['o', '^', 's'])): axes[2].plot(x, np.cos(x) + i * x, linestyle=ls, marker=mk, markevery=10) # 设置标题 # example_utils.title(fig, '"ax.plot(x, y, ...)": Lines and/or markers', y=0.95) # 保存图片 fig.savefig('plot_example.png', facecolor='none') # 展示图片 plt.show() 7 matplotlib散点图 """ 散点图的基本用法 """ import numpy as np import matplotlib.pyplot as plt import example_utils # 随机生成数据 np.random.seed(1874) x, y, z = np.random.normal(0, 1, (3, 100)) t = np.arctan2(y, x) size = 50 * np.cos(2 * t)**2 + 10 fig, axes = example_utils.setup_axes() # 子图1 axes[0].scatter(x, y, marker='o', color='darkblue', facecolor='white', s=80) example_utils.label(axes[0], 'scatter(x, y)') # 子图2 axes[1].scatter(x, y, marker='s', color='darkblue', s=size) example_utils.label(axes[1], 'scatter(x, y, s)') # 子图3 axes[2].scatter(x, y, s=size, c=z, cmap='gist_ncar') example_utils.label(axes[2], 'scatter(x, y, s, c)') # example_utils.title(fig, '"ax.scatter(...)": Colored/scaled markers', # y=0.95) fig.savefig('scatter_example.png', facecolor='none') plt.show() 8 matplotlib柱状图 import numpy as np import matplotlib.pyplot as plt import example_utils def main(): fig, axes = example_utils.setup_axes() basic_bar(axes[0]) tornado(axes[1]) general(axes[2]) # example_utils.title(fig, '"ax.bar(...)": Plot rectangles') fig.savefig('bar_example.png', facecolor='none') plt.show() # 子图1 def basic_bar(ax): y = [1, 3, 4, 5.5, 3, 2] err = [0.2, 1, 2.5, 1, 1, 0.5] x = np.arange(len(y)) ax.bar(x, y, yerr=err, color='lightblue', ecolor='black') ax.margins(0.05) ax.set_ylim(bottom=0) example_utils.label(ax, 'bar(x, y, yerr=e)') # 子图2 def tornado(ax): y = np.arange(8) x1 = y + np.random.random(8) + 1 x2 = y + 3 * np.random.random(8) + 1 ax.barh(y, x1, color='lightblue') ax.barh(y, -x2, color='salmon') ax.margins(0.15) example_utils.label(ax, 'barh(x, y)') # 子图3 def general(ax): num = 10 left = np.random.randint(0, 10, num) bottom = np.random.randint(0, 10, num) width = np.random.random(num) + 0.5 height = np.random.random(num) + 0.5 ax.bar(left, height, width, bottom, color='salmon') ax.margins(0.15) example_utils.label(ax, 'bar(l, h, w, b)') main() 9 matplotlib等高线图 import matplotlib.pyplot as plt import numpy as np from matplotlib.cbook import get_sample_data import example_utils z = np.load(get_sample_data('bivariate_normal.npy')) fig, axes = example_utils.setup_axes() axes[0].contour(z, cmap='gist_earth') example_utils.label(axes[0], 'contour') axes[1].contourf(z, cmap='gist_earth') example_utils.label(axes[1], 'contourf') axes[2].contourf(z, cmap='gist_earth') cont = axes[2].contour(z, colors='black') axes[2].clabel(cont, fontsize=6) example_utils.label(axes[2], 'contourf + contour\n + clabel') # example_utils.title(fig, '"contour, contourf, clabel": Contour/label 2D data', # y=0.96) fig.savefig('contour_example.png', facecolor='none') plt.show() 10 imshow图 import matplotlib.pyplot as plt import numpy as np from matplotlib.cbook import get_sample_data from mpl_toolkits import axes_grid1 import example_utils def main(): fig, axes = setup_axes() plot(axes, *load_data()) # example_utils.title(fig, '"ax.imshow(data, ...)": Colormapped or RGB arrays') fig.savefig('imshow_example.png', facecolor='none') plt.show() def plot(axes, img_data, scalar_data, ny): # 默认线性插值 axes[0].imshow(scalar_data, cmap='gist_earth', extent=[0, ny, ny, 0]) # 最近邻插值 axes[1].imshow(scalar_data, cmap='gist_earth', interpolation='nearest', extent=[0, ny, ny, 0]) # 展示RGB/RGBA数据 axes[2].imshow(img_data) def load_data(): img_data = plt.imread(get_sample_data('5.png')) ny, nx, nbands = img_data.shape scalar_data = np.load(get_sample_data('bivariate_normal.npy')) return img_data, scalar_data, ny def setup_axes(): fig = plt.figure(figsize=(6, 3)) axes = axes_grid1.ImageGrid(fig, [0, 0, .93, 1], (1, 3), axes_pad=0) for ax in axes: ax.set(xticks=[], yticks=[]) return fig, axes main() 11 pyecharts绘制仪表盘 from pyecharts import charts # 仪表盘 gauge = charts.Gauge() gauge.add('Python小例子', [('Python机器学习', 30), ('Python基础', 70.), ('Python正则', 90)]) gauge.render(path="./data/仪表盘.html") print('ok') 12 pyecharts漏斗图 from pyecharts import options as opts from pyecharts.charts import Funnel, Page from random import randint def funnel_base() -> Funnel: c = ( Funnel() .add("豪车", [list(z) for z in zip(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'], [randint(1, 20) for _ in range(7)])]) .set_global_opts(title_opts=opts.TitleOpts(title="豪车漏斗图")) ) return c funnel_base().render('./img/car_fnnel.html') 13 pyecharts日历图 import datetime import random from pyecharts import options as opts from pyecharts.charts import Calendar def calendar_interval_1() -> Calendar: begin = datetime.date(2019, 1, 1) end = datetime.date(2019, 12, 27) data = [ [str(begin + datetime.timedelta(days=i)), random.randint(1000, 25000)] for i in range(0, (end - begin).days + 1, 2) # 隔天统计 ] calendar = ( Calendar(init_opts=opts.InitOpts(width="1200px")).add( "", data, calendar_opts=opts.CalendarOpts(range_="2019")) .set_global_opts( title_opts=opts.TitleOpts(title="Calendar-2019年步数统计"), visualmap_opts=opts.VisualMapOpts( max_=25000, min_=1000, orient="horizontal", is_piecewise=True, pos_top="230px", pos_left="100px", ), ) ) return calendar calendar_interval_1().render('./img/calendar.html') 14 pyecharts绘制graph图 import json import os from pyecharts import options as opts from pyecharts.charts import Graph, Page def graph_base() -> Graph: nodes = [ {"name": "cus1", "symbolSize": 10}, {"name": "cus2", "symbolSize": 30}, {"name": "cus3", "symbolSize": 20} ] links = [] for i in nodes: if i.get('name') == 'cus1': continue for j in nodes: if j.get('name') == 'cus1': continue links.append({"source": i.get("name"), "target": j.get("name")}) c = ( Graph() .add("", nodes, links, repulsion=8000) .set_global_opts(title_opts=opts.TitleOpts(title="customer-influence")) ) return c 15 pyecharts水球图 from pyecharts import options as opts from pyecharts.charts import Liquid, Page from pyecharts.globals import SymbolType def liquid() -> Liquid: c = ( Liquid() .add("lq", [0.67, 0.30, 0.15]) .set_global_opts(title_opts=opts.TitleOpts(title="Liquid")) ) return c liquid().render('./img/liquid.html') 16 pyecharts饼图 from pyecharts import options as opts from pyecharts.charts import Pie from random import randint def pie_base() -> Pie: c = ( Pie() .add("", [list(z) for z in zip(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'], [randint(1, 20) for _ in range(7)])]) .set_global_opts(title_opts=opts.TitleOpts(title="Pie-基本示例")) .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) ) return c pie_base().render('./img/pie_pyecharts.html') 17 pyecharts极坐标图 import random from pyecharts import options as opts from pyecharts.charts import Page, Polar def polar_scatter0() -> Polar: data = [(alpha, random.randint(1, 100)) for alpha in range(101)] # r = random.randint(1, 100) print(data) c = ( Polar() .add("", data, type_="bar", label_opts=opts.LabelOpts(is_show=False)) .set_global_opts(title_opts=opts.TitleOpts(title="Polar")) ) return c polar_scatter0().render('./img/polar.html') 18 pyecharts词云图 from pyecharts import options as opts from pyecharts.charts import Page, WordCloud from pyecharts.globals import SymbolType words = [ ("Python", 100), ("C++", 80), ("Java", 95), ("R", 50), ("JavaScript", 79), ("C", 65) ] def wordcloud() -> WordCloud: c = ( WordCloud() # word_size_range: 单词字体大小范围 .add("", words, word_size_range=[20, 100], shape='cardioid') .set_global_opts(title_opts=opts.TitleOpts(title="WordCloud")) ) return c wordcloud().render('./img/wordcloud.html') 19 pyecharts系列柱状图 from pyecharts import options as opts from pyecharts.charts import Bar from random import randint def bar_series() -> Bar: c = ( Bar() .add_xaxis(['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉']) .add_yaxis("销量", [randint(1, 20) for _ in range(7)]) .add_yaxis("产量", [randint(1, 20) for _ in range(7)]) .set_global_opts(title_opts=opts.TitleOpts(title="Bar的主标题", subtitle="Bar的副标题")) ) return c bar_series().render('./img/bar_series.html') 20 pyecharts热力图 import random from pyecharts import options as opts from pyecharts.charts import HeatMap def heatmap_car() -> HeatMap: x = ['宝马', '法拉利', '奔驰', '奥迪', '大众', '丰田', '特斯拉'] y = ['中国','日本','南非','澳大利亚','阿根廷','阿尔及利亚','法国','意大利','加拿大'] value = [[i, j, random.randint(0, 100)] for i in range(len(x)) for j in range(len(y))] c = ( HeatMap() .add_xaxis(x) .add_yaxis("销量", y, value) .set_global_opts( title_opts=opts.TitleOpts(title="HeatMap"), visualmap_opts=opts.VisualMapOpts(), ) ) return c heatmap_car().render('./img/heatmap_pyecharts.html') 21 matplotlib绘制动画 matplotlib是python中最经典的绘图包,里面animation模块能绘制动画。 首先导入小例子使用的模块: from matplotlib import pyplot as plt from matplotlib import animation from random import randint, random 生成数据,frames_count是帧的个数,data_count每个帧的柱子个数 class Data: data_count = 32 frames_count = 2 def __init__(self, value): self.value = value self.color = (0.5, random(), random()) #rgb # 造数据 @classmethod def create(cls): return [[Data(randint(1, cls.data_count)) for _ in range(cls.data_count)] for frame_i in range(cls.frames_count)] 绘制动画:animation.FuncAnimation函数的回调函数的参数fi表示第几帧,注意要调用axs.cla()清除上一帧。 def draw_chart(): fig = plt.figure(1, figsize=(16, 9)) axs = fig.add_subplot(111) axs.set_xticks([]) axs.set_yticks([]) # 生成数据 frames = Data.create() def animate(fi): axs.cla() # clear last frame axs.set_xticks([]) axs.set_yticks([]) return axs.bar(list(range(Data.data_count)), # X [d.value for d in frames[fi]], # Y 1, # width color=[d.color for d in frames[fi]] # color ) # 动画展示 anim = animation.FuncAnimation(fig, animate, frames=len(frames)) plt.show() draw_chart() 22 pyecharts绘图属性设置方法 这是pyecharts中一般的绘图步骤: from pyecharts.faker import Faker from pyecharts import options as opts from pyecharts.charts import Bar from pyecharts.commons.utils import JsCode def bar_base() -> Bar: c = ( Bar() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题")) ) return c bar_base().render('./bar.html') 那么,如何设置y轴显示在右侧,添加一行代码: .set_global_opts(yaxis_opts=opts.AxisOpts(position='right')) 也就是: c = ( Bar() .add_xaxis(Faker.choose()) .add_yaxis("商家A", Faker.values()) .set_global_opts(title_opts=opts.TitleOpts(title="Bar-基本示例", subtitle="我是副标题")) .set_global_opts(yaxis_opts=opts.AxisOpts(position='right')) ) 如何锁定这个属性,首先应该在set_global_opts函数的参数中找,它一共有以下11个设置参数,它们位于模块charts.py: title_opts: types.Title = opts.TitleOpts(), legend_opts: types.Legend = opts.LegendOpts(), tooltip_opts: types.Tooltip = None, toolbox_opts: types.Toolbox = None, brush_opts: types.Brush = None, xaxis_opts: types.Axis = None, yaxis_opts: types.Axis = None, visualmap_opts: types.VisualMap = None, datazoom_opts: types.DataZoom = None, graphic_opts: types.Graphic = None, axispointer_opts: types.AxisPointer = None, 因为是设置y轴显示在右侧,自然想到设置参数yaxis_opts,因为其类型为types.Axis,所以再进入types.py,同时定位到Axis: Axis = Union[opts.AxisOpts, dict, None] Union是pyecharts中可容纳多个类型的并集列表,也就是Axis可能为opts.AxisOpt, dict, 或None三种类型。查看第一个opts.AxisOpt类,它共定义以下25个参数: type_: Optional[str] = None, name: Optional[str] = None, is_show: bool = True, is_scale: bool = False, is_inverse: bool = False, name_location: str = "end", name_gap: Numeric = 15, name_rotate: Optional[Numeric] = None, interval: Optional[Numeric] = None, grid_index: Numeric = 0, position: Optional[str] = None, offset: Numeric = 0, split_number: Numeric = 5, boundary_gap: Union[str, bool, None] = None, min_: Union[Numeric, str, None] = None, max_: Union[Numeric, str, None] = None, min_interval: Numeric = 0, max_interval: Optional[Numeric] = None, axisline_opts: Union[AxisLineOpts, dict, None] = None, axistick_opts: Union[AxisTickOpts, dict, None] = None, axislabel_opts: Union[LabelOpts, dict, None] = None, axispointer_opts: Union[AxisPointerOpts, dict, None] = None, name_textstyle_opts: Union[TextStyleOpts, dict, None] = None, splitarea_opts: Union[SplitAreaOpts, dict, None] = None, splitline_opts: Union[SplitLineOpts, dict] = SplitLineOpts(), 观察后尝试参数position,结合官档:https://pyecharts.org/#/zh-cn/global_options?id=axisopts%ef%bc%9a%e5%9d%90%e6%a0%87%e8%bd%b4%e9%85%8d%e7%bd%ae%e9%a1%b9,介绍x轴设置position时有bottom, top, 所以y轴设置很可能就是left,right. 23 pyecharts绘图属性设置方法(下) 1)柱状图显示效果动画对应控制代码: animation_opts=opts.AnimationOpts( animation_delay=500, animation_easing="cubicOut" ) 2)柱状图显示主题对应控制代码: theme=ThemeType.MACARONS 3)添加x轴对应的控制代码: add_xaxis( ["草莓", "芒果", "葡萄", "雪梨", "西瓜", "柠檬", "车厘子"] 4)添加y轴对应的控制代码: add_yaxis("A", Faker.values(), 5)修改柱间距对应的控制代码: category_gap="50%" 6)A系列柱子是否显示对应的控制代码: is_selected=True 7)A系列柱子颜色渐变对应的控制代码: itemstyle_opts={ "normal": { "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 244, 255, 1)' }, { offset: 1, color: 'rgba(0, 77, 167, 1)' }], false)"""), "barBorderRadius": [6, 6, 6, 6], "shadowColor": 'rgb(0, 160, 221)', }} 8)A系列柱子最大和最小值标记点对应的控制代码: markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ] ) 9)A系列柱子最大和最小值标记线对应的控制代码: markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值") ] ) 10)柱状图标题对应的控制代码: title_opts=opts.TitleOpts(title="Bar-参数使用例子" 11)柱状图非常有用的toolbox显示对应的控制代码: toolbox_opts=opts.ToolboxOpts() 12)Y轴显示在右侧对应的控制代码: yaxis_opts=opts.AxisOpts(position="right") 13)Y轴名称对应的控制代码: yaxis_opts=opts.AxisOpts(,name="Y轴") 14)数据轴区域放大缩小设置对应的控制代码: datazoom_opts=opts.DataZoomOpts() 完整代码 def bar_border_radius(): c = ( Bar(init_opts=opts.InitOpts( animation_opts=opts.AnimationOpts( animation_delay=500, animation_easing="cubicOut" ), theme=ThemeType.MACARONS)) .add_xaxis( ["草莓", "芒果", "葡萄", "雪梨", "西瓜", "柠檬", "车厘子"]) .add_yaxis("A", Faker.values(),category_gap="50%",markpoint_opts=opts.MarkPointOpts(),is_selected=True) .set_series_opts(itemstyle_opts={ "normal": { "color": JsCode("""new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: 'rgba(0, 244, 255, 1)' }, { offset: 1, color: 'rgba(0, 77, 167, 1)' }], false)"""), "barBorderRadius": [6, 6, 6, 6], "shadowColor": 'rgb(0, 160, 221)', }}, markpoint_opts=opts.MarkPointOpts( data=[ opts.MarkPointItem(type_="max", name="最大值"), opts.MarkPointItem(type_="min", name="最小值"), ] ),markline_opts=opts.MarkLineOpts( data=[ opts.MarkLineItem(type_="min", name="最小值"), opts.MarkLineItem(type_="max", name="最大值") ] )) .set_global_opts(title_opts=opts.TitleOpts(title="Bar-参数使用例子"), toolbox_opts=opts.ToolboxOpts(),yaxis_opts=opts.AxisOpts(position="right",name="Y轴"),datazoom_opts=opts.DataZoomOpts(),) ) return c bar_border_radius().render() 24 1 分钟学会画 pairplot 图 使用 seaborn 绘制 sepal_length, petal_length 两个特征间的关系矩阵: from sklearn.datasets import load_iris import matplotlib.pyplot as plt import seaborn as sns from sklearn import tree sns.set(style="ticks") df02 = df.iloc[:,[0,2,4]] # 选择一对特征 sns.pairplot(df02) plt.show() 设置颜色多显: sns.pairplot(df02, hue="species") plt.show() 绘制所有特征散点矩阵: sns.pairplot(df, hue="species") plt.show()