Артефакт рисования машинного обучения Matplotlib

искусственный интеллект визуализация данных

Общественный номер: You Er Hut
Автор: Питер
Редактор: Питер

Всем привет, меня зовут Питер~

Matplotlib — очень классическая библиотека для построения графиков, даже некоторые людиnumpy+pandas+matplotlibназови этоТри мушкетера анализа данных, достаточно, чтобы проиллюстрировать важность этой библиотеки. Хотя Питер любит Plotly, овладение навыками рисования в Matplotlib также очень важно.

Слишком много навыков рисования на основе Matplotlib.Друзьям, которые хотят узнать больше, рекомендуется перейти непосредственно на официальный сайт:мат сюжет lib.org/.

Из этой статьи вы узнаете следующее:

  • Базовый графический рисунок: линейная диаграмма, столбчатая диаграмма, гистограмма, диаграмма с двумя осями и т. Д.
  • Советы по рисованию: добавьте легенды, заголовки, примечания, цвета и многое другое
  • Настоящий бой: график биржевых трендов и построение графика K-линии

библиотека импорта

При рисовании нужно импортировать общие библиотеки, при использовании matplotlib для рисования также нужно решить проблему китайского

import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

# 用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']  
# 解决负号“-”显示为
plt.rcParams['axes.unicode_minus'] = False  

линейный график

x = [2,3,4]
y = [4,6,8]

plt.plot(x,y)
plt.show()

Многолинейный график

# 默认参数
x1 = np.array([1,3,5])
y1 = x1 + 4
plt.plot(x1,y1)

# 第二条红线
y2 = x1 * 2
plt.plot(x1,y2,color="red",linewidth=3,linestyle="--")
plt.show()

Гистограмма

x = [2,3,4,5,6]
y = [4,6,8,10,12]

plt.bar(x,y)
plt.show()

График рассеяния

x = np.random.rand(20)  # 0-1之间的20个随机数
y = np.random.rand(20)

plt.scatter(x,y)
plt.show()

Гистограмма

# 随机生成1000个服从正态分布的数据,均值为0,标准差为1
data = np.random.randn(1000)

plt.hist(data, bins=40, edgecolor="black")
plt.show()

Частотная гистограмма

Основная причина в том, что ось Y изменилась, все они представлены десятичными знаками.

data = np.random.randn(1000)

# 区别:加上参数density=1
plt.hist(data, bins=40, density=1, edgecolor="black")
plt.show()

навыки рисования

Совет 1: Установите размер

x = [2,3,4]
y = [4,6,8]

plt.plot(x,y)
#设置大小  8代表800像素
plt.rcParams["figure.figsize"] = (8,6)

plt.show()

Добавить текстовое описание

Текстовое описание содержит заголовки, метки осей и т. д.

x = [2,3,4]
y = [4,6,8]

plt.plot(x,y)
# 添加标题和轴名称
plt.title("Title")
plt.xlabel("x axis")
plt.ylabel("y axis")

plt.show()

Изменить стиль линии

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
x=np.arange(1,8)

plt.plot(x,marker='>')
plt.plot(x+4,marker='+')
plt.plot(x*2,marker='o')
plt.show()

добавить заметки

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False

x=[1, 2, 3, 4]
y=[1, 4, 9, 16]

plt.plot(x,y)
plt.xlabel('x坐标轴')
plt.ylabel('y坐标轴')
plt.title('标题')

# 添加注释
plt.annotate('我是注释', 
             xy=(2,5), 
             xytext=(2, 10),
            arrowprops=dict(facecolor='black', 
                            shrink=0.01),
            )

plt.show()

Добавить легенду

# 第一条
x1 = np.array([1,3,5])
y1 = x1 + 4
plt.plot(x1,y1,label="y=x+4 ")

# 第二条红线
y2 = x1 * 2
plt.plot(x1,y2,
         color="red",
         linewidth=3,
         linestyle="--",
         label="y=x*2")

# 设定位置
plt.legend(loc='upper left')
plt.show()

настроить цвет

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

x=np.arange(1,8)

#颜色的多种写法
plt.plot(x,color='r')  # r表示red  g表示green  b表示blue
plt.plot(x+1,color='0.5')
plt.plot(x+2,color='#AF00FF')
plt.plot(x+3,color=(0.1,0.2,0.3))
plt.show()

установить двойную ось

# 1
x1 = np.array([1,3,5])
y1 = 50*x1 + 14
plt.plot(x1,y1,label="y=50 * x + 4 ")
plt.legend(loc='upper right') # 图例位置

# 重要代码:设置双轴
plt.twinx()  

# 2
y2 = -x1 * 20 + 3
plt.plot(x1,y2,color="red",
         linewidth=3,
         linestyle="--",
         label="y=-x * 20 + 3")
plt.legend(loc='upper left')

plt.show()

Шкала оси вращения

Когда значение масштаба оси слишком длинное, мы можем отобразить его, повернув

x = ["Monday","Thursday","Wednesday"]
y = [4,6,8]

plt.plot(x,y)
plt.xticks(rotation=45)

plt.show()

Построение нескольких графиков — способ 1

import matplotlib.pyplot as plt

# 绘制第1张子图:折线图
ax1 = plt.subplot(221)
plt.plot([1, 2, 3], [2, 4, 6])

# 绘制第2张子图:柱形图
ax2 = plt.subplot(222)
plt.bar([1, 2, 3], [2, 4, 6])

# 绘制第3张子图:散点图
ax3 = plt.subplot(223)
plt.scatter([1, 3, 5], [7, 9, 11])

# 绘制第4张子图:直方图
ax4 = plt.subplot(224)
plt.hist([2, 5, 2, 8, 4])

plt.show()

Построение нескольких графиков — метод 2

Функция subplots в основном имеет два параметра: nrows представляет количество строк, ncols представляет количество столбцов; в то же время задайте размер figsize.

Функция возвращает оси сбора фигур и субфигурок холста.

fig, axes = plt.subplots(nrows=2, ncols=2,figsize=(10,6))

# flatten表示将子图合集展开,得到每个子图
ax1,ax2,ax3,ax4 = axes.flatten()

ax1.plot([1, 2, 3], [2, 4, 6])
ax2.bar([1, 2, 3], [2, 4, 6])
ax3.scatter([1, 3, 5], [7, 9, 11])
ax4.hist([2, 5, 2, 8, 4])

plt.show()

Практическая битва: анализ трендов акций

Берем стоковые данные с официального сайта Tushare, сначала устанавливаем:

pip install tushare

получить данные

import tushare as ts

df = ts.get_k_data("000001",start="2020-05-08",end="2020-08-08")
df

Для того, чтобы облегчить последующее рисование, нужно изменить поле даты на индекс:

# 将日期设置成索引
df1 = df.set_index("date")

рисунок по умолчанию

Мы используем цену закрытия закрытия, чтобы нарисовать график по умолчанию.

fig = df1["close"].plot()

plt.show()

добавить заголовок

# Pandas直接绘图
fig = df["close"].plot(title="PingAn")
plt.show()

Приведенное выше нарисовано с использованием встроенного метода линейных диаграмм Pandas, а следующее нарисовано с использованием Matplobtlib:

# 使用Matplotlib绘图

# 获取数据
# import tushare as ts
# df = ts.get_k_data("000001",start="2018-08-08",end="2020-08-08")

# 调整时间
from datetime import datetime
df["date"] = df["date"].apply(lambda x:datetime.strptime(x,"%Y-%m-%d"))

# 绘制折线图
import matplotlib.pyplot as plt
%matplotlib inline

plt.plot(df["date"],df["close"])
# 标题
plt.title("PingAn")
# 旋转
plt.xticks(rotation=-45)  
plt.show()

Продвинутая практика: нарисуйте диаграмму K-line

Во-первых, давайте разберемся с базовыми знаниями об акциях:Влияние роста и падения фондового рынка на график К-линии

Установить библиотеку

Чтобы рисовать свечные графики, нам нужно установить библиотеку:

#安装库mpl_finance
pip install mpl_finance

получить код

df = ts.get_k_data("000001",start="2020-09-08",end="2021-03-08")
df.head()

  • дата: дата
  • открыто: цена открытия
  • закрыть: цена закрытия
  • высокий: самая высокая цена
  • низкий: самая низкая цена
  • объем: объем
  • код: биржевой код

преобразование формата даты

Определите функцию, которая преобразует даты в строковой форме в числа:

from matplotlib.pylab import date2num
import datetime

def date_to_number(dates):
    number_time = []
    for date in dates:
        # 字符串转时间戳格式
        date_time = datetime.datetime.strptime(date,"%Y-%m-%d")
        # 时间戳格式转成数字格式
        number_date = date2num(date_time)
        number_time.append(number_date)
    return number_time

Следующая операция состоит в том, чтобы извлечь часть значений из приведенных выше данных и преобразовать их в numpy; в то же время вызовите указанную выше функцию:

# DataFrame转成numpy数组格式
df1 = df.values  

# 将二维数组的日期转成数字(使用上面的函数)
df1[:,0] = date_to_number(df1[:,0])  

Нарисуйте диаграмму K-линии

fig, ax = plt.subplots(figsize=(15,6))

mpf.candlestick_ochl(ax, # 绘图Axes的实例,画布中的子图
                     df1,  # 带绘图的数据
                     width=0.5,  # K线柱形的宽度
                     colorup="red",  # 收盘价>开盘价
                     colordown="green",  # 收盘价<开盘价
                     alpha=5)  # 柱子的透明度

plt.grid(True)  # 显示网格线
ax.xaxis_date() # 将x轴设置成常规的日期格式

Добавить скользящее среднее

В приведенном ниже коде добавляются данные 5-дневной и 20-дневной скользящей средней:

Нарисуйте график скользящей средней

fig, ax = plt.subplots(figsize=(15,6))

mpf.candlestick_ochl(ax, # 绘图Axes的实例,画布中的子图
                     df1,  # 带绘图的数据
                     width=0.5,  # K线柱形的宽度
                     colorup="red",  # 收盘价>开盘价
                     colordown="green",  # 收盘价<开盘价
                     alpha=5)  # 柱子的透明度

# 添加均线
plt.plot(df1[:,0],df["MA5"], c="black")
plt.plot(df1[:,0],df["MA20"])

plt.grid(True)  # 显示网格线
ax.xaxis_date() # 将x轴设置成常规的日期格式

# 添加标题
plt.title("PingAn")
plt.xlabel("date")
plt.ylabel("Price")
plt.show()

Добавить громкость

Ставим свечной график на первый подграфик, а объем на вторую позицию:

#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False

# 画布、子图、共享x轴
fig, ax = plt.subplots(2,1,sharex=True,figsize=(15,6)) 

ax1,ax2 = ax.flatten()

# 第一个图
mpf.candlestick_ochl(ax1, # 绘图Axes的实例,画布中的子图
                     df1,  # 带绘图的数据
                     width=0.5,  # K线柱形的宽度
                     colorup="red",  # 收盘价>开盘价
                     colordown="green",  # 收盘价<开盘价
                     alpha=5)  # 柱子的透明度

# 添加均线
ax1.plot(df1[:,0],df["MA5"], c="black")
ax1.plot(df1[:,0],df["MA20"])

# 显示网格线
ax1.grid(True)  
# 将x轴设置成常规的日期格式
ax1.xaxis_date() 
# 添加标题、轴名称等
ax1.set_title("平安股价走势图")
ax1.set_xlabel("时间")
ax1.set_ylabel("价格")
# --------------------------

# 第2个子图
ax2.bar(df1[:,0],df1[:,5])
ax2.set_xlabel("时间")
ax2.set_ylabel("成交量")  # 成交量
ax2.grid(True)
ax2.xaxis_date()

plt.show()