как заполнить pcolor штриховкой, сопоставив ее вместе с заливкой цветом

Привет, я хочу продолжить то, о чем я уже спрашивал здесь Создать вертикальную линейчатую диаграмму с накоплением, привязанную к значениям y (литологический/стратиграфический столбец)

Вопрос как сделать несколько штриховок на моем pcolor, вот картинка

введите здесь описание изображения

Я хочу сделать этот белый цвет pcolor с рисунком «x», а красный - с «+».

Любые способы сделать это? заранее спасибо

lithcode = {'ABT': 1, 'AT': 2, 'GD': 3, 'BAT': 4, 'BTT': 5, 'TT': 6, 'NC': 7, 'MV':8, 'MS':9, 'GW':10}
colors = ['darkred', 'crimson', 'red', 'peru', 'lightsalmon', 'lightpink', 'white', 'oldlace', 
          'thistle', 'lightgray']
hatch=['','+','','','','','x','','','']
cmap = ListedColormap(colors)


Zb=litho['litho'].map(lithcode).to_numpy().reshape(1, -1)
nonan=np.count_nonzero(Zb[np.logical_not(np.isnan(Zb))])
Za=litho['litho'][:nonan].map(lithcode).to_numpy().reshape(1, -1)
X=litho['elev litho'][:nonan]
cl.pcolor(X, [0, 1], Za, cmap=cmap, vmin=1, vmax=len(colors))

# ax.set_yticks(data['md litho']) optionally set the y-ticks to indicate the row borders
hands = [Patch(color=col, label=k) for k, col in zip(lithcode.keys(), colors)]
cl.legend(handles=hands, loc=(1.01, 0), ncol=2, fontsize=8)
        

person muhammad tajul arifin    schedule 03.12.2020    source источник


Ответы (1)


На основе данных связанного примера и Как вывести экземпляр PolyCollection? для метода чтобы вылупить PolyCollection, созданный pcolor:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from matplotlib.patches import Patch, PathPatch
import pandas as pd

df = pd.DataFrame({'md litho': [0, 31, 49, 67, 406, 427, 442],
                   'litho': ['NC', 'AT', 'BTT', 'NC', 'ABT', 'BAT', 'NC']})
lithcode = {'ABT': 1, 'AT': 2, 'GD': 3, 'BAT': 4, 'BTT': 5, 'TT': 6, 'NC': 7, 'MV': 8, 'MS': 9, 'GW': 10}
colors = ['darkred', 'crimson', 'red', 'peru', 'lightsalmon', 'lightpink', 'white', 'oldlace', 'thistle', 'lightgray']
cmap = ListedColormap(colors)
hatches = ['', '++', '', '', '', '', 'xx', '', '', '']

fig, ax = plt.subplots(figsize=(12, 1.4))
lithcode_values = df['litho'][:-1].map(lithcode).to_numpy()
polycollection = ax.pcolor(df['md litho'], [0, 1], lithcode_values.reshape(1, -1), cmap=cmap, vmin=1, vmax=len(colors))
ax.set_xticks(df['md litho'])  # optionally set the x-ticks to indicate the column borders
ax.set_yticks([])  # hide ticks on the y-axis

for path, d2_val in zip(polycollection.get_paths(), lithcode_values):
    hatch = hatches[d2_val - 1]
    if hatch != '':
        ax.add_patch(PathPatch(path, hatch=hatch, facecolor='none', edgecolor='black'))

hands = [Patch(facecolor=col, label=k, edgecolor='black', hatch=hatch) for k, col, hatch in
         zip(lithcode.keys(), colors, hatches)]
ax.legend(handles=hands, bbox_to_anchor=(1.03, 1.02), loc='upper left', ncol=2, fontsize=8, facecolor='PaleTurquoise')
plt.tight_layout()  # this fits the legend and the labels nicely into the figure
plt.show()

пример графика

PS: импортировать matplotlib.pyplot как cl очень запутанно.

person JohanC    schedule 03.12.2020
comment
Привет, извини @JohanC, я какое-то время не занимался этой работой с Python. У меня все еще есть проблема в цикле люка. Когда я использовал свой собственный скрипт, а не из вашего примера, появляется сообщение об ошибке, в котором говорится, что at ---› Hatch = Hatches[d2_val - 1] 'только целочисленные скалярные массивы могут быть преобразованы в скалярный индекс'. я все еще разбираюсь в этом на самом деле - person muhammad tajul arifin; 07.12.2020
comment
Не могли бы вы распечатать lithcode_values и проверить, что это массив целых чисел? Таким образом, d2_val в приведенном выше коде должно быть одним целым числом. Не могли бы вы отредактировать свой вопрос с изменениями кода? - person JohanC; 07.12.2020
comment
Эй, @JohanC, это работает! Большое спасибо! - person muhammad tajul arifin; 13.12.2020