Есть ли способ построить столбцы с одинаковыми именами одного цвета? - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь построить один набор данных, в котором много столбцов с одинаковыми именами. Я пытался повторно использовать программу построения графиков, которую я сделал ранее, но проблема в том, что она отображает каждый столбец другим цветом, вместо этого я бы хотел, чтобы каждый столбец с таким же именем был того же цвета . Кроме того, он добавляет каждый столбец к легенде, вызывая большой беспорядок на рисунке, который я прикрепил. Есть ли способ просто поставить одну этикетку для каждого цвета? Мы будем очень благодарны за любую помощь в исправлении этих проблем!

Вот пример графика Как вы можете видеть, вместо того, чтобы отображать оба «O» как один цвет, он отображает их как два, поскольку там являются двумя столбцами данных и дублируются в легенде.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

s = pd.read_csv('Edit_This.csv') # reads the .csv file can be found in dropbox > shared manuscripts > Ravi Ben MoOx Nucleation and LEIS > Figures

xmin = 0 # Change these bounds as needed
xmax = 1
ymin = 0
ymax = 2500

y_axis_columns = s.columns[1:] # Reads column data to plot y values from index 1 onwards

for col_name in y_axis_columns: # Loop to plot all columns until it finds an empty one
   plt.plot(s.depth,s[col_name], label=col_name)
   plt.tight_layout()
   from matplotlib.ticker import MaxNLocator
   axes = plt.gca()
   axes.yaxis.set_major_locator(MaxNLocator(integer=True))
   axes.set_xlim([xmin,xmax])
   axes.set_ylim(ymin,ymax)
   plt.xlabel('Depth (nm)', fontsize=12) # Edit as needed
   plt.ylabel('Intensity (counts/nC)', fontsize=12) 
   plt.legend(loc='upper center', fontsize=10) # Defines legend formatting
   plt.savefig("6_Sputter1_5-222cyc_SiOx.png", dpi = 1200) # Edit export file name and DPI here
plt.show()

Вы можете загрузить данные по этой ссылке

1 Ответ

0 голосов
/ 29 мая 2020

Хорошо, проблема возникает из-за того, что у вас есть несколько столбцов с одинаковым именем. Итак, вам нужно с этим справиться. Следующий код делает это:

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D

s = pd.read_csv('Edit_This.csv') # reads the .csv file can be found in dropbox > shared manuscripts > Ravi Ben MoOx Nucleation and LEIS > Figures

xmin = 0 # Change these bounds as needed
xmax = 1
ymin = 0
ymax = 2500

y_axis_columns = s.columns[1:] # Reads column data to plot y values from index 1 onwards


# this is the color dictionary
colors = {"O": 'r', "Mo": 'b', 'Al':'g'}

for col_name in y_axis_columns: # Loop to plot all columns until it finds an empty one
   plt.plot(s.depth,s[col_name], label=col_name, color=colors[col_name.split('.')[0]])
   plt.tight_layout()
   from matplotlib.ticker import MaxNLocator
   axes = plt.gca()

axes.yaxis.set_major_locator(MaxNLocator(integer=True))
axes.set_xlim([xmin,xmax])
axes.set_ylim(ymin,ymax)
plt.xlabel('Depth (nm)', fontsize=12) # Edit as needed
plt.ylabel('Intensity (counts/nC)', fontsize=12) 

# Defines legend formatting
custom_lines = [Line2D([0], [0], color='r', lw=4),
                Line2D([0], [0], color='b', lw=4),
                Line2D([0], [0], color='g', lw=4)]
plt.legend(custom_lines, ['O', 'Mo', 'Al'], loc='upper center', fontsize=10)

plt.savefig("6_Sputter1_5-222cyc_SiOx.png", dpi = 1200) # Edit export file name and DPI here
plt.show()

В результате получается следующее изображение: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...