Python-Matplotlib zeichnet die Dinge, die Sie nicht kennen

Handhabung von Teilstrichetiketten auf der X-Achse

Fügen Sie hier eine Bildbeschreibung ein

plt.xticks(rotation=45)

Bildunterschrift hinzufügen

plt.text() kann an einer beliebigen Stelle im Diagramm Text hinzufügen und unterstützt die LaTex-Syntax

text(x, y, s='das ist Text', Schriftgröße=15)
x: die Position der x-Achse
y: die Position der y-Achse
s: legt den Inhalt des geschriebenen Textes fest Schriftgröße: legt die Größe fest der Welt

import numpy as np
plt.plot(np.random.random(30).cumsum(), color='k', linestyle='dashed', marker='^')
plt.text(18, 10, r'$\mu=100,\ \sigma=15$')
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Textnotiz

Bei der Datenvisualisierung wird der Text im Bild häufig verwendet, um einige Merkmale im Bild zu kommentieren. Solche Anmerkungen können bequem mit der Methode annotate() hinzugefügt werden. Berücksichtigen Sie bei der Verwendung von Annotate die Koordinaten von zwei Punkten: xy(x, y), wo der Text mit Anmerkungen versehen wird, und xytext(x, y), wo der Text eingefügt wird

annotate( s='lxz', xy=(1980, 65.1), xytext=(1970, 77.1),xycoords='data', textcoords='data', color='r', Fontsize=20, Arrowprops=dict( Arrowstyle="->",connectionstyle='arc3',color='r',) )
s: stellt den zu kommentierenden Inhalt dar (erforderlicher Parameter)
xy: (tatsächlicher Punkt) stellt die Position der x- und y-Achse dar (erforderlich). Parameter)
xytext: (die tatsächliche Position von „Kommentarinhalt“) passt die Position von „Kommentarinhalt“ an. Wenn nicht festgelegt, wird standardmäßig die Position von xy verwendet. „
tatsächlicher
Stil“) Wenn nicht festgelegt, wird die xycoords-Einstellung verwendet Standardmäßig (optional)
Farbe: die Farbe des Kommentarinhalts Schriftgröße: die Schriftgröße des Kommentarinhalts

Pfeil setzen

Arrowprops=dict(arrowstyle="-", Connectionstyle='arc3', color='r',)
Arrowstyle: Pfeilstil festlegen Connectionstyle: Verbindungsstilfarbe: Pfeilfarbe

import numpy as np
plt.plot(np.random.random(30).cumsum(), color='k', linestyle='dashed', marker='^')
plt.annotate('local max', xy=(15, 8), xytext=(8, 12),
            arrowprops=dict(facecolor='r', shrink=0.05))
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

import matplotlib.pyplot as plt
from matplotlib import style

style.use('ggplot')

fig = plt.figure()
ax1 = plt.subplot2grid((1,1), (0,0))

ax1.plot([1,2,3],[3,7,2],label = 'price')
ax1.plot([3,7,2],[1,2,3],label = 'price2')

font_dict = {
    
    'family':'serif',
             'color':'darkred',
             'size':15}

#我们使用ax1.text添加文本,坐标为(4,4)
#我们使用fontdict参数添加一个数据字典,来使用所用的字体。 
#在我们的字体字典中,我们将字体更改为serif,颜色为『深红色』,然后将字体大小更改为 15。
ax1.text(4, 4,'Text Example(4,4)', fontdict=font_dict)


#用另一种方式进行注解,xytext为比例
ax1.annotate('2nd annotation',(2.9,2.9),
             xytext=(0.4, 0.6), textcoords='axes fraction',
             arrowprops = dict(facecolor='grey',color='grey'))

plt.legend()
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Chinesisch und Schriftarten

Methode eins

Globale Schriftarteneinstellung für Umweltverschmutzung
plt.rcParams['font.sans-serif'] = ['SimHei'] #Schritt
1 (serifenlose Schriftart ersetzen) plt.rcParams['axes.unicode_minus'] = False #Schritt
2 (Koordinaten auflösen Das negative Vorzeichen der negativen Achsenzahl zeigt das Problem)

Methode Zwei

Globale Schriftarteinstellungen nicht verschmutzen
plt.ylabel("y-axis", fontproperties="SimSun") # (Song-Schriftart)
plt.title("title", fontproperties="SimHei") # (schwarzer Körper)

Schriftgröße

plt.rcParams['xtick.labelsize'] = 24 plt.rcParams['ytick.labelsize'] =
20 plt.rcParams['font.size'] = 15

x = range(1,13,1)
y = range(1,13,1)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.plot(x,y)
plt.title('中文测试')
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Ränder und horizontale Linien

fig = plt.figure()
ax1 = plt.subplot2grid((1,1), (0,0))
ax1.plot([1,2,3],[3,7,2],label = 'price', color= 'b')

#左边框设为青色
ax1.spines['left'].set_color('c')

#删除右、上边框
ax1.spines['right'].set_visible(False)
ax1.spines['top'].set_visible(False)

#让左边框变粗
ax1.spines['left'].set_linewidth(5)

#橙色的x轴数值
ax1.tick_params(axis='x', colors='#f06215')

#直接画一条水平线
ax1.axhline(5, color='y', linewidth=3)

plt.show()

Fügen Sie hier eine Bildbeschreibung ein

gestapeltes Diagramm

Gestapelte Diagramme werden verwendet, um „Teile-zu-Ganze“-Beziehungen im Zeitverlauf darzustellen. Ein gestapeltes Diagramm ähnelt im Grunde einem Kreisdiagramm, nur dass es sich um einen Zeitverlauf handelt.

Stellen wir uns eine Situation vor, in der wir 24 Stunden am Tag haben und sehen möchten, wie wir unsere Zeit verbringen. Wir unterteilen unsere Aktivitäten in: Schlafen, Essen, Arbeiten und Spielen.

Nehmen wir an, wir möchten es über einen Zeitraum von 5 Tagen verfolgen, dann sehen unsere anfänglichen Daten so aus:

days = [1,2,3,4,5]

sleeping = [7,8,6,11,7]
eating =   [2,3,4,3,2]
working =  [7,8,7,2,2]
playing =  [8,5,7,8,13]

#因此,我们的x轴将包括day变量,即 1, 2, 3, 4 和 5。然后,日期的各个成分保存在它们各自的活动中。

plt.stackplot(days, sleeping,eating,working,playing, colors=['m','c','r','yellow'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.show()

Fügen Sie hier eine Bildbeschreibung ein
Hier können wir zumindest farblich sehen, wie wir unsere Zeit verbringen. Das Problem ist, dass wir nicht wissen, welche Farbe welche Farbe hat, ohne einen Blick auf den Code zu werfen. Das nächste Problem besteht darin, dass wir die Daten bei Polygonen nicht wirklich „beschriften“ können. Überall dort, wo es sich also nicht nur um eine Linie mit einer Füllung wie dieser oder einem gestapelten Plot handelt, können wir bestimmte Teile nicht automatisch beschriften. Dies sollte Programmierer nicht aufhalten. Wir können dieses Problem lösen:

days = [1,2,3,4,5]

sleeping = [7,8,6,11,7]
eating =   [2,3,4,3,2]
working =  [7,8,7,2,2]
playing =  [8,5,7,8,13]

#我们在这里做的是画一些空行,给予它们符合我们的堆叠图的相同颜色,和正确标签。 
#我们还使它们线宽为 5,使线条在图例中显得较宽。
plt.plot([],[],color='m', label='Sleeping', linewidth=5)
plt.plot([],[],color='c', label='Eating', linewidth=5)
plt.plot([],[],color='r', label='Working', linewidth=5)
plt.plot([],[],color='yellow', label='Playing', linewidth=5)

plt.stackplot(days, sleeping,eating,working,playing, colors=['m','c','r','yellow'])

plt.xlabel('x')
plt.ylabel('y')
plt.title('Interesting Graph\nCheck it out')
plt.legend()
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Das Kreisdiagramm zeigt a

slices = [7,2,2,13]
activities = ['sleeping','eating','working','playing']
cols = ['c','m','r','b']

#slices是切片内容
plt.pie(slices,
        labels=activities,
        colors=cols,
        startangle=90,   #第一条线开始的角度,90度即为竖线
        shadow= True,    
        explode=(0,0.1,0,0),    #一个切片拉出
        autopct='%1.1f%%')   #选择将百分比放置到图表上面

plt.title('Interesting Graph\nCheck it out')
plt.show()

Fügen Sie hier eine Bildbeschreibung ein
In plt.pie müssen wir das „Slice“ angeben, das die relative Größe jedes Teils darstellt. Anschließend geben wir eine Liste von Farben für das entsprechende Slice an. Als nächstes können wir den „Startwinkel“ des Diagramms angeben. Dadurch können Sie überall mit dem Zeichnen beginnen. In unserem Beispiel haben wir für das Kreisdiagramm einen 90-Grad-Winkel gewählt, was bedeutet, dass das erste Segment ein vertikaler Balken ist. Als nächstes haben wir die Möglichkeit, der Zeichnung einen Schatten in Zeichengröße hinzuzufügen, und dann können wir mit „Explodieren“ sogar einen Ausschnitt herausziehen.

Wir haben insgesamt vier Slices, also übergeben wir für „explodieren“ 0,0,0,0, wenn wir keine Slices ziehen wollen. Wenn wir das erste Slice ziehen wollen, übergeben wir 0,1,0,0,0.

Schließlich verwenden wir autopct und platzieren die Prozentsätze oben im Diagramm.

Blasendiagramm

Eine Art Streudiagramm, das Hinzufügen des dritten Werts s kann als gewöhnliche Streuung verstanden werden, die Zeichnung ist zweidimensional und das Blasendiagramm spiegelt die Größe von Z wider

# 泡泡图
np.random.seed(19680801)

N = 50
x = np.random.rand(N)
y = np.random.rand(N)
colors = np.random.rand(N)
area = (30 * np.random.rand(N))**2  # 0 to 15 point radii

plt.scatter(x, y, s=area, c=colors, alpha=0.5)
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Konturlinie

Sowohl „contour“ als auch „contourf“ zeichnen dreidimensionale Konturkarten. Der Unterschied besteht darin, dass „contourf“ den Bereich zwischen den Konturlinien ausfüllt.

x = np.arange(-5, 5, 0.1)
y = np.arange(-5, 5, 0.1)
xx, yy = np.meshgrid(x, y, sparse=True)
z = np.sin(xx**2 + yy**2) / (xx**2 + yy**2)
plt.contour(x, y, z) # contourf
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

import matplotlib.pyplot as plt
import numpy as np

# 定义等高线高度函数
def f(x, y):
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(- x ** 2 - y ** 2)

# 数据数目
n = 256
# 定义x, y
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)

# 生成网格数据
X, Y = np.meshgrid(x, y)


# 填充等高线的颜色, 8是等高线分为几部分
plt.contourf(X, Y, f(X, Y), 8, alpha = 0.75, cmap = plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X, Y), 8, colors = 'black', linewidth = 0.5)
# 绘制等高线数据
plt.clabel(C, inline = True, fontsize = 10)

# 去除坐标轴
plt.xticks(())
plt.yticks(())
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Radarkarte

# 导入第三方模块
import numpy as np
import matplotlib.pyplot as plt

# 中文和负号的正常显示
plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

# ------------------------------------------------
# 数据处理和准备
values = [98, 45, 124, 83, 90, 94] # 数值
labels = ['语文', '英语', '数学', '物理', '化学', '生物']  # 标签
# 设置雷达图的角度,用于平分切开一个圆面
angles = np.linspace(0, 2 * np.pi, len(values), endpoint=False)  # 角度
'''
—— 拼接数组:
# 注意:数组之间形状要一致才可以拼接
np.concatenate((a, b), axis=0) 一维数组
np.concatenate((c, d), axis=1) 二维数组
'''
# 为了使雷达图一圈封闭起来,需要下面的步骤, 首尾相连
values = np.concatenate((values,[values[0]]))  
angles = np.concatenate((angles,[angles[0]]))  
print('\n>>>', values, '\n>>>', angles)


# --------------------------------------------------
# 绘图
fig = plt.figure()

''' 雷达图的核心 '''
# polar=True 这里一定要设置为极坐标格式
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, values, marker='o', color='r', linewidth=2)  # 绘制折线图
ax.fill(angles, values, color='b', alpha=0.25)  # 填充蓝色颜色
ax.set_thetagrids(angles * 180/np.pi, labels)  # 添加每个特征的标签
'''
注意:
ax.plot(x=angles, y=values, marker='o', linewidth=2)
加上 x, y 显示不出线的标记
'''

# -------------------------------------------------
# 其他设置
ax.set_ylim(0,150)  # 设置雷达图的范围
plt.title('单个学生成绩展示')  # 添加标题
ax.grid(True)  # 添加网格线
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

gemeinsame Achsen

Teilen Sie eine X-Achsen-Koordinate und verwenden Sie zur Identifizierung zwei Skalen auf der linken und rechten Seite der Y-Achse

Axes.twinx(), Axes.twiny() werden verwendet, um Achseninstanzen zu generieren, um x- oder y-Koordinatenachsen gemeinsam zu nutzen.
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False)
nrows,ncols: Wird verwendet, um die Anzahl der Zeilen und Spalten zum Zeichnen von Unterdiagrammen zu bestimmen.
Sharex, Sharey: Wird verwendet, um zu bestimmen, ob die Achsenskalierung geteilt werden soll. Bei der Einstellung „True“ oder „All“ wird die Parameterskala gemeinsam genutzt. Bei der Einstellung „False“ oder „None“ wird dies bei jeder Unterzeichnung der Fall sein be Es verfügt über eine eigene unabhängige Skalierung. Wenn es auf Zeile oder Spalte eingestellt ist, werden die x- und y-Achsenskalen der Zeile und Spalte gemeinsam genutzt. Wenn sharex='col', nur die x-Skalenbeschriftung der unteren Achsen der Spalte wird erstellt

# 共享x坐标轴
# Create some mock data
t = np.arange(0.01, 10.0, 0.01)
data1 = np.exp(t)
data2 = np.sin(2 * np.pi * t)

fig, ax1 = plt.subplots()

color = 'tab:red'
ax1.set_xlabel('time (s)')
ax1.set_ylabel('exp', color=color)
ax1.plot(t, data1, color=color)
ax1.tick_params(axis='y', labelcolor=color)

ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axis

color = 'tab:blue'
ax2.set_ylabel('sin', color=color)  # we already handled the x-label with ax1
ax2.plot(t, data2, color=color)
ax2.tick_params(axis='y', labelcolor=color)

fig.tight_layout()  # otherwise the right y-label is slightly clipped
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Dreidimensionale Karte

Das Modul mpl_toolkits.mplot3d bietet dreidimensionale Zeichenfunktionen basierend auf matplotlib. Da es die zweidimensionale Zeichenfunktion von matplotlib verwendet, um die Zeichenarbeit dreidimensionaler Grafiken zu realisieren, ist die Zeichengeschwindigkeit begrenzt und es ist nicht für das dreidimensionale Zeichnen großer Datenmengen geeignet. Wenn Sie komplexere 3D-Datenvisualisierungsfunktionen benötigen, können Sie Mayavi verwenden.

1 Erstellen Sie 3D-Grafikobjekte

fig = plt.figure() # Bildobjekt erstellen
ax = Axes3D(fig) # Mehrachsiges 3D-Objekt erstellen

2 Zeichnen Sie die Oberfläche

Axes3D.plot_surface(X, Y, Z, *args, **kwargs)

3. Stellen Sie den Achsenbereich ein

Legen Sie den Bereich der x-, y- und z-Achse fest [a, b]
ax.set_xlim(a, b)
ax.set_ylim(a, b)
ax.set_zlim(a,b)

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure(figsize=(8, 6))
ax = Axes3D(fig)
delta = 0.125
# 生成代表X轴数据的列表
x = np.arange(-3.0, 3.0, delta)
# 生成代表Y轴数据的列表
y = np.arange(-2.0, 2.0, delta)
# 对x、y数据执行网格化
X, Y = np.meshgrid(x, y)
Z1 = np.exp(-X**2 - Y**2)
Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)
# 计算Z轴数据(高度数据)
Z = (Z1 - Z2) * 2
# 绘制3D图形
ax.plot_surface(X, Y, Z,
    rstride=1,  # rstride(row)指定行的跨度
    cstride=1,  # cstride(column)指定列的跨度
    cmap=plt.get_cmap('rainbow'))  # 设置颜色映射
# 设置Z轴范围
ax.set_zlim(-2, 2)
# 设置标题
plt.title("3D")
plt.show()

Fügen Sie hier eine Bildbeschreibung ein
Projektionsmodus
Der Projektionsmodus bestimmt die Art und Weise, wie Punkte von Datenkoordinaten in Bildschirmkoordinaten umgewandelt werden. Der Name des aktuell gültigen Projektionsmodus kann durch die folgende Anweisung ermittelt werden:

aus Matplotlib Projektionen importieren
Projektionen.get_projection_names()

Der Projektionsmodus „3D“ erscheint in dieser Liste erst, nachdem das Modul mplot3d geladen wurde. „aitoff“, „hammer“, „lamberf“, „mollweide“ usw. sind alle Kartenprojektionen, „polar“ ist eine Polarkoordinatenprojektion und „rectilinear“ ist der standardmäßige geradlinige Projektionsmodus.

import numpy as np
import mpl_toolkits.mplot3d 
import matplotlib.pyplot as plt

x, y = np.mgrid[-2:2:20j, -2:2:20j] 
z = x * np.exp( - x**2 - y**2)
ax = plt.subplot(111, projection='3d') 
ax.plot_surface(x, y, z, rstride=2, cstride=1, cmap = plt.cm.Blues_r) 
ax.set_xlabel("X")
ax.set_ylabel("Y")
ax.set_zlabel("Z")
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

from matplotlib import cm
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
plt.show()

Fügen Sie hier eine Bildbeschreibung ein

Supongo que te gusta

Origin blog.csdn.net/qq_47326711/article/details/127459275
Recomendado
Clasificación