# Python数据分析基础 — 数据可视化（第2版）¶

### 王斌会 王术 电子工业出版社 2021.1¶

## 习题5¶

### 一、选择题¶

> 1:A 2:D 3:B 4:C 5:D 6:D 7:C 8:B

## 二、分析题¶

（请在问题下面的空白框写出代码并执行以输出结果）

1. 试说明ggplot绘图系统的优点和缺点；试述本章介绍的三种绘图系统matplotlib，seaborn和ggplot的特点。

1. 对一组50人的饮酒者所饮酒类进行调查，把饮酒者按红酒（1）、白酒（2）、黄酒（3）、啤酒（4）分成四类。调查数据如下：

> 3，4，1，1，3，4，3，3，1，3，2，1，2，1，3，4，1，1，3，4，3，3，1，3，2， 1，2，1，2，3，2，3，1，1，1，1，4，3，1，2，3，2，3，1，1，1，1，4，3，1。

- 请用matplotlib，seaborn和ggplot三种绘图系统绘制频数分布和统计图。

In [1]:

    import pandas as pd
    pd.set_option('display.max_rows', 8)
    data52=pd.read_excel('mydata1.xlsx','5.2');data52

Out[1]:

| 酒类
--- | ---
0 | 3
1 | 4
2 | 1
3 | 1
... | ...
46 | 1
47 | 4
48 | 3
49 | 1

50 rows × 1 columns

In [2]:

    data521=data52.酒类.value_counts();data521

Out[2]:

    1    20
    3    16
    2     8
    4     6
    Name: 酒类, dtype: int64

In [3]:

    types=[1,2,3,4]
    counts=[20,16,8,6]
    data522=pd.DataFrame({'types':types,'counts':counts});data522

Out[3]:

| types | counts
--- | --- | ---
0 | 1 | 20
1 | 2 | 16
2 | 3 | 8
3 | 4 | 6

In [4]:

    import matplotlib.pyplot as plt
    plt.bar(types,counts);    #使用matplotlib绘图系统

In [5]:

    import seaborn as sns
    sns.barplot(x=types,y=counts,ci=0,palette='Blues_d');   #使用seaborn绘图系统

In [6]:

    from plotnine import * #导入plotnine包的绘图函数
    from plotnine.data import * #导入plotnine自带的数据集
    ggplot(mtcars,aes('wt','mpg',color='factor(gear)'))+geom_point()+stat_smooth(method='lm')+facet_wrap('~gear')

Out[6]:

    <ggplot: (130549121835)>

In [7]:

    ggplot(data522,aes(x='types',y='counts'))+geom_bar(stat='identity')

Out[7]:

    <ggplot: (130549593703)>

1. economics数据集给出了美国经济增长变化的数据。该数据是数据框格式，由478行和6个变量组成，变量如下。

> date：日期，单位为月份；

> psavert：个人存款率；

> pce：个人消费支出，单位为十亿美元；

> uemploy：失业人数，单位为千人；

> unempmed：失业时间中位数，单位为周；

> pop：人口数，单位为千人。

- 请用matplotlib，seaborn和ggplot三种绘图系统绘制：

（1）以date为横坐标，unemploy/pop为纵坐标画折线图。

In [8]:

    #!pip install pydataset
    from plotnine.data import economics

In [9]:

    economics

Out[9]:

| date | pce | pop | psavert | uempmed | unemploy
--- | --- | --- | --- | --- | --- | ---
0 | 1967-07-01 | 507.4 | 198712 | 12.5 | 4.5 | 2944
1 | 1967-08-01 | 510.5 | 198911 | 12.5 | 4.7 | 2945
2 | 1967-09-01 | 516.3 | 199113 | 11.7 | 4.6 | 2958
3 | 1967-10-01 | 512.9 | 199311 | 12.5 | 4.9 | 3143
... | ... | ... | ... | ... | ... | ...
570 | 2015-01-01 | 12080.8 | 320367 | 5.5 | 13.4 | 8979
571 | 2015-02-01 | 12095.9 | 320534 | 5.7 | 13.1 | 8705
572 | 2015-03-01 | 12161.5 | 320707 | 5.2 | 12.2 | 8575
573 | 2015-04-01 | 12158.9 | 320887 | 5.6 | 11.7 | 8549

574 rows × 6 columns

In [10]:

    plt.plot(economics['date'],economics['unemploy']);

In [11]:

    plt.plot(economics['date'],economics['pop']);

In [12]:

    sns.lineplot(x=economics.date,y=economics.unemploy);

In [13]:

    sns.lineplot(x=economics['date'],y=economics['pop']);

In [14]:

    ggplot(economics,aes(x='date'))+geom_line(aes(y='unemploy'))

Out[14]:

    <ggplot: (130549724775)>

In [15]:

    ggplot(economics,aes(x='date'))+geom_line(aes(y='pop'))

Out[15]:

    <ggplot: (130549755516)>

（2）以date为横坐标，unempmed为纵坐标画折线图。

In [16]:

    plt.plot(economics.date,economics.uempmed);

In [17]:

    sns.lineplot(x=economics.date,y=economics.uempmed);

In [18]:

    ggplot(economics,aes(x='date'))+geom_line(aes(y='uempmed'))

Out[18]:

    <ggplot: (130549829690)>