Рисование цветной карты категорий землепользования на Python?
столкнулся со следующей задачей: нужно нарисовать цветную карту категорий землепользования по данным Текст (где каждый столбец это определенная категория), то есть что-то вроде рисунка:
где синий цвет – вода, светло-коричневый – кустарник, черный – пашня, светло-зеленый – лиственный лес, серо-коричневый – смешанный лес, темно-зеленый – хвойный лес, красный – городская застройка. Как это можно осуществить на Python?
Раньше строил только цветные карты по одному набору данных ,например, по данным температуры воздуха (+поля ветров):

с помощью следующего кода:
#colormaps with wind's vectors (u,v) for xy_plane
import glob
import matplotlib.pyplot as plt
from matplotlib import ticker
from matplotlib.ticker import MaxNLocator
import numpy as np
#parameter name
def parName(file_list,i):
with open(file_list[0]) as file:
par_name = np.loadtxt(file, dtype='str', usecols=i)[1]
file.close()
return par_name
#read coordinates x,y and u,v components
def read_coord(file_list,cols):
with open(file_list[0]) as file:
coord = np.loadtxt(file,skiprows=2,usecols=cols)
В данном же случае, нужно сразу несколько наборов данных нарисовать.
file.close()
x = coord[:,0].reshape(50,50)
y = coord[:,1].reshape(50,50)
return x, y
#determination of the borders of the color scale
def scale_bounds(file_list,i):
with open(file_list[0]) as file:
z = np.loadtxt(file,skiprows=2,usecols=i)
file.close()
minv = min(z)
maxv = max(z)
for f in file_list[1:]:
with open(f) as file:
z = np.loadtxt(file,skiprows=2,usecols=i)
file.close()
if minv>min(z):
minv=min(z)
if maxv<max(z):
maxv = max(z)
return minv, maxv
def draw_picture(file_list,i,x,y,u,v,scale_name,title,savepath):
for f in file_list:
with open(f) as file:
data = np.loadtxt(file,skiprows=2,usecols=i).reshape(50, 50)
file.close()
levels = MaxNLocator(nbins='auto').tick_values(minv, maxv)
fig = plt.figure(figsize=(15, 10))
ax = plt.subplot()
cs = ax.contourf(x, y, data, levels=levels, cmap='jet')
cbar = fig.colorbar(cs,label = scale_name)
plt.title(title)
ax.set_xlabel(parName(file_list,0))
ax.set_ylabel(parName(file_list,1))
q = ax.quiver(x, y, u, v)
fig.savefig(savepath+parName(file_list,i)+'_'+f[-6:]+'.png')
#plt.show()
return 0
file_list = glob.glob('.../xy-plane/*.dat')
savepath = '.../xy_plane/'
#T10
i = 5
title = 'Temperature at a height of 10 meters from the surface'
scale_name1 = 'Temperature, C'
#par_name = parName(file_list,i)
cols=[0,1]
x, y = read_coord(file_list,cols)
cols=[2,3]
u, v = read_coord(file_list,cols)
minv, maxv = scale_bounds(file_list,i)
print('minvT=',minv,'maxvT=', maxv)
draw_picture(file_list,i,x,y,u,v,scale_name1,title,savepath)
Сейчас же нужно отрисовать сразу несколько массивов данных.
Ответы (1 шт):
В общем, я не совсем понимаю, как у вас распределяются данные в исходном файле, но могу предложить такое решение:
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.cm as cm
df = pd.read_csv("kvCJ.csv", sep=r"\s+", header=None, usecols = [0, 1,3,4,5,6], names=["x", "y", "a", "b", "c", "d"])
df['a'].to_numpy().nonzero()
fig = plt.figure(figsize=(10,10))
categories = ["a", "b", "c", "d"]
colors = iter(["yellow", "brown", "gray", "green"])
plt.scatter(df['x'], df['y'], color="lightblue", marker="s", s=50)
for ctg in categories:
plt.scatter(df.loc[df[ctg].gt(0), 'x'], df.loc[df[ctg].gt(0), 'y'], color=next(colors), marker="s", s=50)
plt.show()
