Curso matplotlib - Elementos de texto
Os elementos de texto (legendas e títulos) são muito importantes para um gráfico, pois é através deles que dizemos ao leitor o que cada elemento gráfico representa.
Legendas

As legendas são caixas de texto que explicam os elementos dos gráficos. Inserir uma legenda no gráfico criado com o matplotlib é muito simples, bastando passar o nome desejado para o parâmetro label em plt.scatter(). Também precisamos adicionar o plt.legend(), que irá efetivamente criar a legenda e adicionar ela a figura criada. Este último parâmetro deve estar posicionado após o plt.scatter() e antes de plt.show().
Então, precisamos da seguinte estrutura:
plt.figure()
plt.scatter(label="Nome da legenda")
plt.legend()
plt.show()
Por exemplo, caso for adicionado apenas o parâmetro label em plt.scatter():
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.show()
Figura 1 - Gráfico de dispersão com legenda não inserida.

obtemos o gráfico sem as legendas. Mas ao adicionar o plt.legend() após o plt.scatter(), obtemos as legendas corretamente:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.show()
Figura 2 - Gráfico de dispersão com legenda.

Observe que, se o plt.legend() estiver antes de plt.scatter(), a legenda não será inserida e um aviso será apresentado:
No handles with labels found to put in legend.
Devemos inserir a legendas apenas após a criação dos elementos anteriores, como a figura (plt.figure()) e o elemento de dispersão (plt.scatter()). O plt.legend() deve ser adicionado antes do gráfico ser apresentado (plt.show()).
Posição das Legendas no gráfico
Podemos especificar o local em que a legenda será inserida no gráfico, o que é feito passando a posição desejada através do parâmetro loc em plt.legend(). Esta posição pode ser definida através de uma str ou através de um número int que se refere a posição desejada.
Temos 10 posições disponíveis, sendo que a loc='best' é a posição padrão:
'best’, que corresponde ao código0, e a legenda é posicionada na melhor posição definida por um algoritmo (valor padrão);'upper right', que corresponde ao código1, e a legenda é posicionada no canto superior direito;'upper left', que corresponde ao código2, e a legenda é posicionada no canto superior esquerdo;'lower left', que corresponde ao código3, e a legenda é posicionada no canto inferior esquerdo;'lower right', que corresponde ao código4, e a legenda é posicionada no canto inferior direito;'right', que corresponde ao código5, e a legenda é posicionada no canto direito;'center left', que corresponde ao código6, e a legenda é posicionada no centro a esquerda;'center right', que corresponde ao código7, e a legenda é posicionada no centro a direita;'lower center', que corresponde ao código8, e a legenda é posicionada no centro inferior;'upper center', que corresponde ao código9, e a legenda é posicionada no centro superior;'center', que corresponde ao código10, e a legenda é posicionada no centro do gráfico;
Visualmente:

O notebook utilizado para desenhar a imagem acima pode ser acessado clicando aqui.
Por exemplo, para deixar a legenda no centro do gráfico, podemos utilizar loc='center':
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend(loc = 'center')
plt.show()
Figura 3 - Gráfico de dispersão com a legenda posicionada no centro do gráfico.

Também temos a possibilidade de especificar a posição da legenda de forma arbitrária, o que é feito passando uma tuple com a posição desejada para x e y para o parâmetro bbox_to_anchor em plt.legend().
plt.legend(bbox_to_anchor=(x,y))
Por exemplo, para adicionar a legenda em x = 0.1 e y = 0.1:
plt.figure(figsize=(8,6))
plt.scatter(x, y, s = 100.1, marker = "D", edgecolors = 'k', facecolors = 'none',
label="Raças de cachorros")
plt.legend(bbox_to_anchor = (0.1,0.1))
plt.show()
Figura 4 - Gráfico de dispersão com a legenda posicionada em x = 0 e y = 0.

Para alocar a legenda fora do gráfico, basta passar valores maiores de 1 para x e/ou y. Por exemplo, para deixar a legenda no canto superior direito, mas fora do gráfico, podemos deixar x = 1.02 e y = 1:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend(bbox_to_anchor=(1.02,1))
plt.show()
Figura 5 - Gráfico de dispersão com a legenda posicionada em x = 1.02 e y = 1.

Você encontra mais detalhes sobre o posicionamento das legendas na documentação. Iremos voltar a abordar o caso do posicionamento das legendas fora do gráfico quando formos exportar o gráfico.
Tamanho da fonte da legenda no gráfico

É possível alterar o tamanho da fonte da legenda diretamente em plt.legend(). Basta passar um número (int ou float) para o plt.legend() através do parâmetro fontsize:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend(bbox_to_anchor=(1.02,1), fontsize=20)
plt.show()
Figura 6 - Gráfico de dispersão com a legenda com tamanho de fonte aumentado.

Título do eixo x

Para adicionar um título ao eixo x, utilizamos o plt.xlabel(), passando como uma str o texto que será adicionado ao título do eixo x. O plt.xlabel() precisa estar posicionado antes de plt.show():
plt.figure()
...
plt.xlabel()
plt.show()
Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.show()
Figura 7 - Gráfico de dispersão título no eixo x.

É possível alterar o espaçamento entre o eixo x e o nome do eixo x, passando um número (que pode ser um float ou int) através do parâmetro labelpad. O valor padrão é 4.0. Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)", labelpad=20.0)
plt.show()
Figura 8 - Gráfico de dispersão com título no eixo x com espaçamento.

É possível alterar a posição do título do eixo x através do parâmetro loc. Temos três opções:
'center'(padrão): posiciona o título no centro do eixox;'right': posiciona o título à direita do eixox;'left': posiciona o título à esquerda do eixox;
Por exemplo, para deixar o título do eixo x no canto direito basta passar loc="right":
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)", labelpad=20, loc="right")
plt.show()
Figura 9 - Gráfico de dispersão com título no eixo x no canto direito e com espaçamento .

Você encontra mais informações sobre o plt.xlabel() na documentação.
Título do eixo y

Para adicionar um título ao eixo y, utilizamos o plt.ylabel(), passando como uma str o texto que será adicionado ao título do eixo y. Assim como o plt.xlabel(), o plt.ylabel() precisa esta posicionado antes de plt.show().
plt.figure()
...
plt.ylabel()
plt.show()
Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)")
plt.show()
Figura 10 - Gráfico de dispersão título no eixo y.

Também é possível alterar o espaçamento entre o eixo y e o titulo do eixo y, passando um número (float ou int) através do parâmetro labelpad. O valor padrão é 4.0. Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)", labelpad=25)
plt.show()
Figura 11 - Gráfico de dispersão título no eixo y com espaçamento.

Também é possível alterar a posição do título do eixo y através do parâmetro loc. Temos três opções:
'center'(padrão): posiciona o título no centro do eixoy;'bottom': posiciona o título na base do eixoy;'top': posiciona o título no topo do eixoy;
Por exemplo, para deixar o título do eixo y no topo, basta utilizar loc = "top":
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)", labelpad=25, loc='top')
plt.show()
Figura 12 - Gráfico de dispersão título no eixo y com espaçamento e no topo do gráfico.

Mais informações sobre o plt.ylabel() podem ser encontradas na documentação.
Título do gráfico

Para adicionar um título ao gráfico utilizamos o plt.title(), passando como uma str o nome para o título. O plt.title() precisa esta posicionado antes de plt.show().
plt.figure()
...
plt.title()
plt.show()
Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)")
plt.title("Relação entre peso e altura de diversas raças de cachorro")
plt.show()
Figura 13 - Gráfico de dispersão com título.

É possível alterar o espaçamento entre o título do gráfico e o topo do gráfico, passando um número (float ou int) através do parâmetro labelpad. O valor padrão é 6.0. Por exemplo:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)")
plt.title("Relação entre peso e altura de diversas raças de cachorro", pad=40)
plt.show()
Figura 14 - Gráfico de dispersão com título com espaçamento.

Também é possível alterar a posição do título do gráfico através do parâmetro loc. Temos três opções:
'center'(padrão): posiciona o título no centro (em relação ao eixo x);'right': posiciona o título à direita (em relação ao eixo x);'left': posiciona o título à esquerda (em relação ao eixo x);
Por exemplo, para deixar o título do gráfico justificado à direita:
plt.figure(figsize=(8,6))
plt.scatter(x,y, s = 100.1, marker = "D", edgecolors = 'k', facecolors='none',
label="Raças de cachorros")
plt.legend()
plt.xlabel("Peso (kg)")
plt.ylabel("Altura (cm)")
plt.title("Relação entre peso e altura de diversas raças de cachorro", pad=40, loc='right')
plt.show()
Figura 15 - Gráfico de dispersão com título com espaçamento e justificado à direita.

Você encontra mais informações sobre o plt.title() na documentação.