2017-01-19 15 views
-1

Мне нужно построить диаграмму диаграммы рассеяния 7x7 по metplotlib.pyplot (в настоящий момент нет морского дна). Я пытаюсь сделать это полуавтоматикой, поэтому я использую массив имен топоров ax11, ax12, ......, ax77, чтобы представить подзаголовки. когда я использую их для вызова разброса, он отклоняется, я думаю, что python распознает их как строки, а не ключевые слова для подзаголовка. Сообщение об ошибке «AttributeError: объект« str »не имеет атрибута« разброс ». Вот часть кода:python-'str 'abject не имеет атрибута «разброс»


import matplotlib.pyplot as plt 
import numpy as np 

characters = ['A','B','C','D','E','F'] 

box = dict(facecolor ='yellow', pad = 5, alpha = 0.2) 

fig, ((ax11,ax12,ax13,ax14,ax15,ax16,ax17),\ 
     (ax21,ax22,ax23,ax24,ax25,ax26,ax27),\ 
     (ax31,ax32,ax33,ax34,ax35,ax36,ax37),\ 
     (ax41,ax42,ax43,ax44,ax45,ax46,ax47),\ 
     (ax51,ax52,ax53,ax54,ax55,ax56,ax57),\ 
     (ax61,ax62,ax63,ax64,ax65,ax66,ax67),\ 
     (ax71,ax72,ax73,ax74,ax75,ax76,ax77),\ 
    ) = plt.subplots(7,7) 
fig.subplots_adjust(left = 0.2, wspace =0.2,) 
fig.tight_layout(pad=1, w_pad=2, h_pad=4.0) 
st = fig.suptitle("Scatterplot diagram", \ 
    fontsize="x-  large") 

for i in range(7): 
    for j in range(7): 
     no_ax = str(i)+str(j) 
     nm_ax = "ax"+str(no_ax) 
     nm_ax.scatter(data[caracters[i]],data[caracters[i]]) 
     nm_ax.set_title('xy') 
     nm_ax.set_xlabel('x') 
     nm_ax.set_ylabel('y') 
     continue 

st.set_y(0.95) 
fig.subplots_adjust(top=0.85) 

plt.show() 

Я считаю, что есть способ, чтобы преобразовать строку в нужный формат, но я не знаю, как. Пожалуйста помоги. Благодарю.

+0

Непонятно, чего вы пытаетесь достичь с помощью этого кода. Основная причина в том, что никто не знает, что такое «данные». Вам необходимо предоставить эту информацию и лучше включить «данные» в свой код. Используйте упрощенную версию, которая позволяет воспроизвести ошибку. – ImportanceOfBeingErnest

+0

Возможно, это не имеет никакого отношения к типу данных. Проблема в том, что когда обычно используют ax1.scatter ([1,2,3], [1,2,3]), но здесь я использую «ax11.scatter» ([1,2,3], [1,2 , 3]). строка 'ax11' должна быть преобразована в тот же тип, что и ax1. Наверное, так выглядит Python. – yuewu008

+0

не имеет никакого отношения к типу данных. Как вы говорите выше, '' ax "+ str (no_ax)' является строкой python, но вам нужен экземпляр 'Axes' для вызова' scatter'. Существует множество способов перебрать эти экземпляры осей; взгляните на примеры «matplotlib», чтобы увидеть их. Например, http://matplotlib.org/examples/pylab_examples/subplots_demo.html – tom

ответ

0

В целом следует избегать подхода к созданию имен переменных из строк. Хотя это можно сделать с помощью функции eval, это даже не нужно.

Проблема заключается в линиях

no_ax = str(i)+str(j) #this is a string 
nm_ax = "ax"+str(no_ax) # this is still a string 
nm_ax.scatter(data[caracters[i]],data[caracters[i]]) 
# a string cannot be plotted to 

Строка не имеет метода scatter. Вам нужен объект axes, на который вы строите.

Решение состоит в том, чтобы просто использовать оси, созданные при вызове plt.subplots() непосредственно в цикле.

import matplotlib.pyplot as plt 
import numpy as np 

fig, axes = plt.subplots(ncols=7,nrows=7) 

for i in range(7): 
    for j in range(7): 
     axes[i,j].scatter(np.random.rand(5),np.random.rand(5)) 
     axes[i,j].set_title('{},{}'.format(i,j)) 

plt.show() 

 Смежные вопросы

  • Нет связанных вопросов^_^