fantastic matplotlib Task02打卡

第二回: 艺术画笔见乾坤

  1. 理论树:这一part主要是讲了三层api,以及重要的第三层Artist。
    backend_bases里的FigureCanvas(画板)和Renderer(画笔)为前两层。
    artist.Artist为第三层(拿起了画笔在画板上画画的手),其包括了primitives(基本要素——线、字、矩形、图等)和container(容器——图形和坐标)。
    代码部分则是关于以上理论的底层实现(Line2D)和直接实现(plot)这种关系的展示。

  2. 思考题答案及代码

  • 1、primitives 和 container的区别和联系是什么,分别用于控制可视化图表中的哪些要素
    答:见上面理论部分第三层。
  • 2、画出下面折线图。

    答:这题主要是涉及了一部分数据预处理的知识。毕竟数据分析和数据可视化不分家。
    难点一:两次groupby的顺序和求和思路。难点二:用Line2D一条一条画。
import pandas as pd
data = pd.read_csv('Drugs.csv')
state = data.groupby(data['State'])
#建立第一层分组格式

import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 8))
plt.style.use('ggplot') 
#这步可以考虑去掉,只是第一眼觉得题目图风格像gg的

for i, group in state:
    subgroup = pd.DataFrame(group.groupby(['YYYY']).sum())#第二层分组且对report求和
    x = subgroup.index.to_list()#生成x轴的列表,下y同理
    y = pd.DataFrame(group.groupby(['YYYY']).sum())['DrugReports'].to_list()
    if i == 'PA':
        ax.add_line(Line2D(x, y, label=i, color='orange', linewidth=5))
        ax.text(x[-1], y[-1], i)
    else:
        ax.add_line(Line2D(x, y, label=i, color='grey'))
        ax.text(x[-1], y[-1], i)

ax.set_xlim(2010, 2017)
ax.set_ylim(0,50000)
ax.set_title('Evolutions of DrugReports')
ax.set_xlabel('Year')
ax.set_ylabel('DrugReports')
ax.grid(True);

生成结果如下图,感觉还是不太一样。
image

  • 3、模仿画出下图。
    20201126105910781
    20201126105910780
    答: 这题比较简单,毕竟题目给了函数以及阴影部分位置。
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 1000)
y = -1 * (x-2) * (x-8) + 10
x1 = np.arange(2, 9, 0.2)
y1 = -1*(x1-2)*(x1-8)+10

fig, ax = plt.subplots()
ax.plot(x, y, color='red')
ax.bar(x1, y1, width=0.1, alpha=0.6, color='grey')
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_xlim(0)
ax.set_ylim(0);

这个倒还原度不错。
image

fig, ax = plt.subplots()

x1 = np.arange(2, 9, 0.001)
y1 = -1*(x1-2)*(x1-8)+10
ax.plot(x, y, color='red')
ax.bar(x1, y1, width=0.001, color='grey', alpha=0.6)
ax.set_xlim(0)
ax.set_ylim(0);

image
总结这第三题就是得抓住,生成曲线和柱状图两部分去完成画图。曲线部分难度不大设置好x和y就行了。柱状图部分主要是调整参数x1的取值间隔和bar(width=?)就可以了。

浙ICP备19012682号